@escaping
은 모든 호출 메소드에 감염되며 에이 포함되어야하는지 컴파일러에서 결정합니다.
(컴파일 된)이 예를 고려
dispatchSometime({ print("Oh yeah") })
func dispatchSometime(_ block:()->()) {
dispatchNow(block)
}
func dispatchNow(_ block:()->()) {
block()
}
이 변형 예는, 그러나, 유형 non-escaping parameter may allow it to escape
의 두 에러를 생성한다 :
가
dispatchSometime({ print("Oh yeah") })
func dispatchSometime(_ block:()->()) {
dispatchLater(block)
}
func dispatchLater(_ block:()->()) {
DispatchQueue.main.async(execute: block)
}
메인 디스패치가 dispatchLater
방법 요구 수단 @escaping
을 추가했으면 dispatchSometime
방법 도에가 필요합니다. 컴파일 할 예제는을 참조하십시오.
dispatchSometime({ print("Oh yeah") })
func dispatchSometime(_ block: @escaping()->()) {
dispatchLater(block)
}
func dispatchLater(_ block: @escaping()->()) {
DispatchQueue.main.async(execute: block)
}
그러나 빼앗아 단지입니다 :
- 보관할 컴파일러가 불평을 멈출 때까지 호출 체인까지
@escaping
를 추가.
- 키워드는 아무 것도 바뀌지 않습니다. 즉, 기본적으로 "차단 된 변수가 블록 자체와 함께 유지 될 수 있으므로
weak
을 사용하도록주의하십시오."라는 경고입니다. 당신이 불평을 막을 수있는 컴파일러를 얻는 @escaping
키워드를 포함하는 여러 가지 방법을 조정해야 할 경우
의미
이 가진 정말 재미 경우입니다. 그러나 해당 메소드가 실제로 프로토콜을 준수하는 경우 해당 프로토콜의 메소드는 @escaping
키워드를 가져와야하며 다른 모든 프로토콜 준수 프로토콜에도 감염됩니다. 장난!
[탈출하지 못하는 매개 변수의 클로저를 사용하면 탈출 할 수 있습니다.] (https://stackoverflow.com/q/38990882/6521116) –