-
[Apple Dev Reference - Swift] Nonescaping Closures앱등이에게 살충제를 뿌린다./Apple Dev Reference 2016. 5. 22. 14:50
<LTE 경리 박경리 경리>
Nonescaping Closures
함수의 파라미터로 클로져가 전달될 때가 있습니다. 이 때, 함수가 종료된 후에도 함수 외부에서 파라미터인 클로져를 사용하는 경우가 있습니다. 이 경우 우리는 클로져가 escape(탈출)되었다고 합니다. 그리고 함수를 정의할 때, 클로져 파라미터에 @noescape키워드를 사용하여 escape하지 않는 클로져라는걸 명시해줄 수 있습니다.
클로져 파라미터 앞에 @noescape를 붙여주면 컴파일러는 이 클로져의 lifespan(생명주기같은?)에 대해 더 잘알기 때문에 좀 더 optimization을 해주게 됩니다.
예를 들어, sort(_:)메소드는 클로져를 파라미터로 받습니다.(배열의 element들을 정렬하는 데에 사용되죠) 이 때, 해당 클로져는 element정렬이 끝나면 더 이상 필요가 없기 때문에 파라미터 선언에 @noescape키워드가 붙습니다.
클로져가 escape하는 한 가지 경우는 함수의 외부에 있는 변수에 클로져를 대입하여 사용하는 것입니다. 예를 들어, 많은 비동기 operation 함수들에서는 completion handler로 클로져 파라미터를 받습니다. 이 함수는 operation이 start하면 종료되지만, 해당 operation의 결과를 얻기 전까지 클로져는 실행이 되지 않습니다.(네트워크 요청 API를 생각하시면 편하겠네요.) 즉, 클로져가 escape되어야 한다는 뜻입니다.
someFunctionWithEscapingClosure(_:)함수는 클로져를 파라미터로 받아 함수 외부의 배열타입 변수에 append하고 있습니다. 위 예제에서 만약 @noescape키워드를 추가해줬다면 컴파일 에러가 발생하게 됩니다.
또한 클로져 파라미터를 @noescape로 선언하게 되면 self키워드가 자동으로 사용되는 효과를 갖습니다.
<escape하지 않는 클로져라는걸 명시해주면 컴파일러가 최적화를 해준다. 하지만 쓸 일이 과연 있을까.. >
출처 : https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html
'앱등이에게 살충제를 뿌린다. > Apple Dev Reference' 카테고리의 다른 글
[Apple Dev Reference - Advanced Swift] Initialization (1) (0) 2016.10.24 [Apple Dev Reference] Nullability and Objective-C (0) 2016.05.22 [Apple Dev Reference - Swift] Strong Reference Cycles for Closures (0) 2016.05.15 [Apple Dev Reference - Swift] ARC & Strong Reference Cycle (1) 2016.05.15 [Apple Dev Reference - Swift] Implicitly Unwrapped Optionals (0) 2016.05.15