@ noescape,@ themcaping和@autoclosure有什么区别?

时间:2016-09-21 09:43:29

标签: ios swift swift3

我正在使用Xcode 8将代码转换为Swift,但编译器警告在已经在Swift 2.3中创建的一些嵌套函数中添加@escape,并使用闭包语法。我还找到了其他一些关键字@noescape@autoclosure,但我对此有一些疑问:

  1. 此关键字的功能需求是什么?
  2. 撰写@escaping的影响是什么?
  3. 有必要写吗?
  4. @autoclosure的行为是否与@escape相同?
  5. 何时使用哪个关键字?为什么?
  6. 这是Swift-evolution文档,但没有从中得到很多。

2 个答案:

答案 0 :(得分:9)

最重要的区别是@escaping@noescaping之间(Swift 3中没有这样的关键字!)。当闭包被标记为@noescape时,您可以确定该方法不会保留闭包(例如,执行异步调用),因此您不必担心所有权周期(有其他一些小的好处)。

@escaping关闭有时可以保存或调用,因此您必须确保正确处理所有权(例如[weak self])。

对于@autoclosure,请参阅How to use Swift @autoclosure。简而言之,它允许您在某些情况下跳过闭包周围的括号。

Swift 3中的默认值(未指定时)为@noescaping(请参阅rationale)。他们的关键字实际上不再存在。只有@escaping

答案 1 :(得分:3)

@escape表示在方法结束后可以调用您的函数。 @noescape表示在传递给函数结束之前调用闭包。 @autoclosure表示您可以省略编写闭包括号,但它会自动变为@noescape@autoclosure在表达式周围创建一个自动闭包。所以当调用者写出像2> 1的表达式时如图1所示,它自动包裹在一个闭包中,成为{2> 1}在传递给某个函数之前。

2 - 编译器更容易执行优化。

3 - 更好地编写,给编译器(或使用你的函数的任何人)信息它与闭包的行为方式

4 - 没有

5 - 在答案的顶部描述