본문 바로가기

iOS 앱 개발자 프로젝트/Swift 문법 정복하기

[Swift] Escaping closure

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