當(dāng)一個(gè)閉包作為參數(shù)傳到一個(gè)函數(shù)中,但是這個(gè)閉包在函數(shù)返回之后才被執(zhí)行,這樣的閉包稱為逃逸閉包。
var oneClosure: (() -> Void)? = nil
func getEscapeClosure(closure: @escaping () -> Void?) {
self.oneClosure = closure
}
getEscapeClosure {
print("This is closure")
}
oneClosure?() //This is closure
但是當(dāng)方法的參數(shù)是可選型的參數(shù)時(shí)添加@escaping會(huì)報(bào)錯(cuò):
func getEscapeClosure(closure: @escaping (() -> Void)?) {
self.closure = closure
}
//@escaping attribute only applies to function types
這是一個(gè)很早就被發(fā)現(xiàn)的問題SR-2444??蛇x型閉包(Optional Closure)的定義就是escaping屬性。推薦正確的使用方式:
typealias NormalClosure = () -> Void
func getEscapeClosure(closure: NormalClosure?) {
self.closure = closure
}