swift|swift @escaping

@escaping用于函数参数,作用于闭包

如果一个闭包被作为一个参数传递给一个函数,并且在函数return之后才被唤起执行,那么这个闭包是逃逸闭包。

在swift2中,有@noescape属性,对应非逃逸闭包,也就是在return之前就被调用,因为闭包在方法调用完成之后就会销毁,不会存在强引用,因此非逃逸闭包中不需要做weak self操作。
在swift3中去掉了@noescape,引入了@escaping,并给将所有的闭包默认作为非逃逸闭包。
public func myFunction(myHandler: @escaping () -> Void) { print("this is my Function") DispatchQueue.main.async { myHandler() } }

【swift|swift @escaping】在上面的例子中,myHandler作为闭包传递到了主线程中执行,可以把主线程认为是一个异步的方法,因为方法执行完成之后可能闭包还没有执行,因此闭包myHandler可能逃出方法,如果不写@escaping,方法编译会通不过,报错如下:

swift|swift @escaping
文章图片
非逃逸闭包报错

    推荐阅读