2024년 3월 15일 금요일
탈출 클로저(Escaping closure)를 활용해 보자.
※ 참고 : Closure
☑️ Escaping Closure
어떤 경우에 사용되는가?
1. 어떤 함수의 내부에 존재하는 클로저(함수)를 외부 변수에 저장하는 경우
2. 클로저가 메서드의 인자로 전달됐을 때, 메서드의 실행이 종료된 후 실행되는 클로저 (비동기)
→ 파라미터 타입 앞에 @escaping이라는 키워드를 명시해야 한다.
예) 비동기로 실행되거나 completionHandler로 사용된 클로저의 경우 클로저를 메서드의 파라미터로 넣을 수 있다.
// 1) 외부 변수 저장
var defaultFunction: () -> () = { print("출력") }
func escapingFunc(closure: @escaping () -> ()) {
// 클로저를 실행하는 것이 아니라 aSavedFunction 변수에 저장.
// 함수는 변수와 달리 기본적으로 외부 할당이 불가능
defaultFunction = closure
}
// 2) GCD 비동기 코드
func asyncEscaping(closure: @escaping (String) -> ()) {
var name = "iOS튜터"
DispatchQueue.main.asyncAfter(deadline: .now() + 3) { //3초뒤에 실행하도록 만들기
closure(name)
}
}
asyncEscaping { str in
print("name : \(str)")
}
@escaping 를 사용하는 클로저에서 self의 요소를 사용할 경우, self를 명시적으로 언급해야 한다. (명시적?)
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
completionHandlers.append(completionHandler)
}
func someFunctionWithNonescapingClosure(closure: () -> Void) {
closure() // 함수 안에서 끝나는 클로저
}
class SomeClass {
var x = 10
func doSomething() {
someFunctionWithEscapingClosure { self.x = 100 } // 명시적으로 self를 적어줘야 합니다.
someFunctionWithNonescapingClosure { x = 200 }
}
}
let instance = SomeClass()
instance.doSomething()
print(instance.x)
// Prints "200"
completionHandlers.first?()
print(instance.x)
// Prints "100"
'iOS 앱 개발자 프로젝트 > Swift 문법 정복하기' 카테고리의 다른 글
[Swift] Struct vs. Class (2) | 2024.03.28 |
---|---|
[Swift] Closure, Higher Order Function (0) | 2024.03.16 |
[Swift] Thread, Asynchronous & Networking (1) | 2024.03.14 |
[Swift] Generic (0) | 2024.03.13 |
[Swift] Extension (0) | 2024.03.13 |