728x90
15. 클로저
막상 ios개발을 해보니 생각 보다 엄청 많이쓰이는 문법이다.
단순하게 생각해서 그냥 익명함수로 생각하겠다. 얘는 파라미터로 함수를 주고 받을 때 많이 사용된다.
예를 들어 데이터를 fetch하는 함수가 있을 때, 데이터를 성공적으로 받았을 때 실행 시킬 함수를 @escaping으로 받는 경우가 있다.
@escaping은 그냥 callback 함수라 생각해도 될 것 같다.
@escaping을 파라미터로 받는 함수가 끝난후 실행될 함수.?
코드를 보면 이런거다.
func fetchUser(withUsername username: String, completion: @escaping(User) -> Void) {
REF_USER_USERNAMES.child(username).observeSingleEvent(of: .value) { (snapshot) in
guard let uid = snapshot.value as? String else { return }
self.fetchUser(uid: uid, complecation: completion)
}
}
=> 설명해보면 firebase에서 user.uid 1234값으로 데이터를 호출하고 나서 하는 행위인데 completion 이놈이 콜백함수다.
저기 @escaping 파라미터에 값을 전달해주려면 어떻게 해야할까? 이럴때 closure을 사용 할 수 있다.
{(user) in self.user = user} 이 부분이 익명함수, 즉 클로져다.
UserService.shared.fetchUser(uid: uid) { (user) in
self.user = user
}
책을 보면 @escaping을 설명할 때 이런 예제가 있다
// 함수의 전달인자로 전달한 클로저가 함수 종료 후에 호출 될 때
// 클로저가 함수를 탈출 한다고 표현합니다.
// 파라미터로 전달된 클로저 -> 함수종료후에 호출 = 클로저가 함수를 탈출
// 비동기 작업을 하는 함수 종료후에 호출될 클로저 = 탈출 클로저
// 외부로 전달되어 외부에서 사용이 가능하다는가, 외부 변수에 저장되면
// @escaping 을 앞에 써줘야한다.
// 즉, 클로저가 return 될 때, 클로저가 외부 변수에 들어갈 때,
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
completionHandlers.append(completionHandler)
}
typealias VoidVoidClosure = () -> Void
let firstClosure: VoidVoidClosure = {
print("Closure A")
}
let secondClousre: VoidVoidClosure = {
print("Closure B")
}
// first와 second 매개변수 클로저는 함수의 반환 값으로 사용될 수 있으므로
// 탈출 클로저입니다.
func returnOneClosure(first: @escaping VoidVoidClosure, second: @escaping VoidVoidClosure, shouldReturnFirstClosure: Bool) -> VoidVoidClosure {
return shouldReturnFirstClosure ? first : second
}
// 함수에서 반환한 클로저가 함수 외부의 상수에 저장되었다.
let returnedClosure: VoidVoidClosure = returnOneClosure(first: firstClosure
, second: secondClousre, shouldReturnFirstClosure: true)
returnedClosure() // Closure A
var closures: [VoidVoidClosure] = []
//closure 매개변수 클로저는 함수 외부의 변수에 저장 될 수 있으므로 탈출 클로저 입니다.
func appendClosure(closure: @escaping VoidVoidClosure) {
closures.append(closure)
}
// 자동 클로저
// 대기중인 손님들입니다.
var customersInLine: [String] = ["YoangWha", "SangYong", "SungHun", "HaMi"]
print(customersInLine.count)
뭔가 책을 읽으면 이게 무슨소린가 싶다...
다른 블로그를 참고하자
반응형
'Swift > Swift 기본문법' 카테고리의 다른 글
Swift 메모리 관리 ARC(Automatic Reference Counting) (0) | 2022.02.05 |
---|---|
Swift 기본 문법 - 16. 맵,필터,리듀서 (0) | 2022.02.04 |
Swift 기본 문법 - 14. 접근제어 (0) | 2022.02.02 |
Swift 기본 문법 - 13. 인스턴스의 생성과 소멸 (0) | 2022.02.01 |
Swift 기본 문법 - 12. 프로퍼티와 메서드 (0) | 2022.01.30 |