→ 클로저가 함수 종료되기 전에 실행되기 때문에 closure()는 Non-escaping 클로저에 해당한다
func runClosure(closure: () -> Void) {
closure()
}
→ completion은 함수의 실행이 종료되기 전에 실행되지 않는다
class ViewModel {
var completionhandler: (() -> Void)? = nil
func fetchData(completion: @escaping () -> Void) {
completionhandler = completion
}
}
즉, 클로저가 함수를 빠져나갔다
→ 함수를 호출하는 도중에 해당 함수 외부에 클로저를 저장하기 위해서는 클로저는 escaping closure여야 한다
// 함수 외부에 클로저를 저장하는 예시
// 클로저를 저장하는 배열
var completionHandlers: [() -> Void] = []
func withEscaping(completion: @escaping () -> Void) {
// 함수 밖에 있는 completionHandlers 배열에 해당 클로저를 저장
completionHandlers.append(completion)
}
func withoutEscaping(completion: () -> Void) {
completion()
}
class MyClass {
var x = 10
func callFunc() {
withEscaping { self.x = 100 }
withoutEscaping { x = 200 }
}
}
let mc = MyClass()
mc.callFunc()
print(mc.x)
completionHandlers.first?()
print(mc.x)
// 결과
// 200
// 100

[Swift] Escaping 클로저 (@escaping)