我正在使用 Xcode 8 将代码转换为 Swift,但编译器警告在一些已在 Swift 2.3 中使用闭包语法创建的嵌套函数中添加 @escape
。我还发现了一些其他关键字 @noescape
和 @autoclosure
,但我对此有一些疑问:
- 此关键字的功能需求是什么?
- 写
@escaping
有什么影响? - 有必要写吗?
@autoclosure
的行为是否与@escape
相同?- 何时使用哪个关键字以及为什么?
这里是 Swift-evolution文件,但从中获益不多。
最佳答案
最重要的区别是 @escaping
和 @noescaping
之间(Swift 3 中没有这样的关键字!)。当闭包被标记为 @noescape
时,您可以确定闭包不会被方法保留(例如执行异步调用),因此您不必担心所有权周期(还有一些其他的小好处)。
@escaping
闭包有时可以在将来保存或调用,因此您必须确保正确处理所有权(例如 [weak self]
)。
对于 @autoclosure
参见 How to use Swift @autoclosure .简而言之,它允许您在某些情况下跳过闭包周围的大括号。
默认(未指定时)是 Swift 3 中的 @noescaping
(参见 rationale)。他们关键字实际上不再存在。只有@escaping
。
关于ios - @noescape、@escaping 和@autoclosure 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39612938/