【问题标题】:What is difference between @noescape, @escaping and @autoclosure?@noescape、@escaping 和 @autoclosure 有什么区别?
【发布时间】:2017-01-29 11:46:32
【问题描述】:

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

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

这是Swift-evolution 文档,但没有从中得到太多。

【问题讨论】:

  • 我刚刚注意到您已标记问题 Swift 3。Swift 3 中没有 @noescape@escape

标签: ios swift


【解决方案1】:

@escape 表示你的函数可以在方法结束后调用。 @noescape 意味着您的闭包将在它传递给的函数结束之前被调用。 @autoclosure 意味着你可以省略写闭包,但它会自动变成@noescape@autoclosure 在表达式周围创建一个自动闭包。因此,当调用者编写像 2 > 1 这样的表达式时,它会在传递给某个函数之前自动包装到一个闭包中成为 {2 > 1}。

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

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

4 - 没有

5 - 在答案顶部描述

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 不错的答案,如果您添加代码示例会更好,因此其他人会更好地了解所有三个关键字。谢谢
    猜你喜欢
    • 1970-01-01
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    • 2015-03-26
    相关资源
    最近更新 更多