Closure는 reference type이다. 한번 생성되어 var / let으로 대입된 것은 별도의 instance로 존재하며 다른 곳에 대입되어도 reference 된다.

@noescape
closure를 parameter로 전달받은 함수는 그 closure를 함수 안에서만 사용하고 바로 파기한다는 것을 명시
closure를 보관하지 않기 떄문에 retain cycle 문제에서 자유로움
compiler가 closure의 수명에 대해서 더 많은 정보를 받으므로 더욱 적극적인 optimizing을 하게 됨

@autoclosure
parameter가 없고 return이 있는 closure를 받는 function은 closure를 autoclosure로 선언할 수 있음
func printNextValue(@autoclosure value: () -> String) {

}

autoclosure를 사용하게 선언되어 있는 function을 호출할 때는 closure 대신 간단한 구문을 사용할 수 있음
printNextValue(values.remove(at: 0))

해당 구문 자체가 자동으로 closure가 되어 전달
func printNextValue(@autoclosure value: () -> String) {
     NSLog(“value \(value())”)
}

구문을 작성한 시점에 동작이 일어나지 않고 전달된 closure가 실행되는 시점에 동작이 일어남. 지연해서 실행할 필요가 있을 때 유용

주의 : 코드의 실행이 읽는 위치에서 바로 되는 경우가 아닌데다 closure인지 인지하지 못할 가능성이 높아 가독성을 매우 떨어뜨림


출처 : 애플 도큐먼트

'Tech > iOS' 카테고리의 다른 글

스위프트 타입 호환성  (0) 2017.01.11
[Swift] Class와 Struct 중에 뭘 쓸까?  (0) 2016.10.28
optional을 쉽게 설명해보자  (0) 2016.05.17
Hashable Protocol  (0) 2016.02.28

+ Recent posts