ios - @noescape、@escaping 和@autoclosure 之间有什么区别?

标签 ios swift

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

  1. 此关键字的功能需求是什么?
  2. @escaping 有什么影响?
  3. 有必要写吗?
  4. @autoclosure 的行为是否与 @escape 相同?
  5. 何时使用哪个关键字以及为什么?

这里是 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/

相关文章:

ios - 具有一个 float 标题的 Tableview 多个部分

json - Alamofire上传参数如何添加Int值

ios - 如何识别我点击了哪个 UIImageview?

ios - 有进度的 Alamofire POST 请求

ios - 我们可以在游戏中添加类似 UIKit 的东西吗

ios - 我怎样才能重绘 UIView 的形状并同时给它一个阴影?

ios - 将 'class variable' 分配给 'lazy var' 内的变量

ios - 如何释放为数组分配的内存?

ios - 需要从 URL 设置图像而不会有任何闪烁。阅读描述以了解完整的场景

ios - 从 View Controller 访问变量到覆盖函数