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()
        }
    }

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


非逃逸闭包报错

你可能感兴趣的:(swift @escaping)