我正在使用Xcode 8将代码转换为Swift,但编译器警告要在一些已经在Swift 2.3中创建的嵌套函数中添加@escape
,使用闭包语法。 我还发现其他一些关键字,如@noescape
和@autoclosure
,但我有一些问题:
- 这个关键字有什么功能需求?
- 编写
@escaping
的影响是什么? - 需要编写吗?
@autoclosure
是否与@escape
行为相同?- 何时使用哪个关键字以及原因?
这里是Swift-evolution文档,但其中并没有太多内容。
我正在使用Xcode 8将代码转换为Swift,但编译器警告要在一些已经在Swift 2.3中创建的嵌套函数中添加@escape
,使用闭包语法。 我还发现其他一些关键字,如@noescape
和@autoclosure
,但我有一些问题:
@escaping
的影响是什么?@autoclosure
是否与@escape
行为相同?这里是Swift-evolution文档,但其中并没有太多内容。
@escaping
和@noescaping
(Swift 3中没有这个关键字!)。当闭包被标记为@noescape
时,您可以确信该闭包不会被方法保留(例如执行异步调用),因此您无需担心所有权循环(还有其他一些次要的好处)。
@escaping
闭包有时可以保存或在将来调用,因此您必须确保正确处理所有权(例如[weak self]
)。@autoclosure
的详细信息,请参见如何使用Swift @ autoclosure。简而言之,它允许您在某些情况下跳过闭包周围的大括号。@noescaping
(请参见理由)。该关键字实际上不再存在,现在只有@escaping
。@escape
表示你的函数可以在方法结束后被调用。
@noescape
表示你的闭包将在传递给函数之前被调用。
@autoclosure
表示你可以省略写闭包括号,但它会自动变成 @noescape
。
@autoclosure
在表达式周围创建一个自动闭包。因此,当调用者写下类似 2 > 1 的表达式时,它会自动包装成 {2 > 1} 的闭包,然后再传递给某个函数。
@noescape
或@escape
。 - Sulthan