当一个闭包作为参数传到一个函数中,但是这个闭包在函数返回之后才被执行,这样的闭包称为逃逸闭包
。
var oneClosure: (() -> Void)? = nil
func getEscapeClosure(closure: @escaping () -> Void?) {
self.oneClosure = closure
}
getEscapeClosure {
print("This is closure")
}
oneClosure?() //This is closure
但是当方法的参数是可选型的参数时添加@escaping
会报错:
func getEscapeClosure(closure: @escaping (() -> Void)?) {
self.closure = closure
}
//@escaping attribute only applies to function types
这是一个很早就被发现的问题SR-2444。可选型闭包(Optional Closure)的定义就是escaping
属性。推荐正确的使用方式:
typealias NormalClosure = () -> Void
func getEscapeClosure(closure: NormalClosure?) {
self.closure = closure
}