Swift @escaping @noescape

1,625 阅读1分钟

在swift3.0之前,clouse默认时可以逃逸的。如果设置不可逃逸,使用@noescape修饰

在swift3.0之后,clouse默认时可以不逃逸的。如果设置可逃逸,使用@escaping修饰

  1. @noescape的含义

    @noescape在swift3.0中已经被废弃了,表示不可逃逸闭包

 func requestAuthorization(@noescape completion: (Bool, Error?) -> Void){}
  1. @escaping的含义

    @noescape在swift3.0中新增修饰符,表示可逃逸闭包

func requestAuthorization(completion: @escaping (Bool, Error?) -> Void){}
**!注意修饰符位置不同**
  1. 什么是逃逸闭包(Escaping Closure)

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

  1. 默认不可逃逸闭包的好处

最明显的好处就是编译器优化你的代码的性能和能力。如果编译器知道这个闭包是不可逃逸的,它可以关注内存管理的关键细节。 而且你可以在不可逃逸闭包里放心的使用self关键字,因为这个闭包总是在函数return之前执行,你不需要去使用一个弱引用去引用self.这对你而言是一个非常nice的功能。