将闭包更新为Swift 3-@escaping

非主题

我已经将代码更新为Xcode 8.0 beta 6,但是我对新的不可转义的闭包默认值感到困惑。在下面的代码的Xcode提示添加@escaping在前面的completion:在下面的第一行代码,但仍然无法编译,去的圈子。*

编辑:实际上,正如Xcode所建议的那样,@escaping应该添加在after之后 completion:。警报可能仍会显示,但清理和编译会将其删除。)*应该如何重新编写/修复此代码才能在更新的Swift 3中工作?我看过新手册,但找不到合适的代码示例。

func doSomething(withParameter parameter: Int, completion: () -> ()) {
    // Does something

    callSomeOtherFunc(withCompletion: completion)
  }

// Calling the method and execute closure 
doSomething(withParameter: 2) {
  // do things in closure
}

任何帮助,不胜感激!

dfri

Swift 3:闭包参数属性现在应用于参数类型,而不是参数本身

在Swift 3之前,闭包属性@autoclosure@noescape曾经是闭包参数的属性,但现在是参数类型的属性请参阅以下接受的Swift进化建议:

您的特定问题与参数类型属性@escaping(适用相同的新规则)有关,如已接受的Swift进化建议中所述,默认情况下让闭包参数不转义:

这些建议现在都在Xcode 8的beta阶段中实现(请参阅Xcode 8 beta 6的发行说明;访问需要开发者帐户登录)

Xcode 8 beta 6中的新增功能-Swift编译器:Swift语言

默认情况下,闭包参数是不转义的,而不是用显式注释@noescape使用@escaping以指示关闭参数可以逃脱。@autoclosure(escaping)现在写成@autoclosure @escaping注释@noescape@autoclosure(escaping)已弃用。(SE-0103)

...

Xcode 8 beta中的新增功能– Swift和Apple LLVM编译器:Swift语言

@noescape@autoclosure属性现在必须在参数名前的参数类型前,而不是被写入。[SE-0049]

因此,您可以@escaping按如下方式使用非默认属性;应用于闭包参数类型,而不是参数本身

func doSomething(withParameter parameter: Int, completion: @escaping () -> ()) {
    // ...
}

(因为我的评论不是关于SO的持久数据,所以在下面的评论中包括我对问题的回答)

@Cristi Băluță:“转义是做什么的?在swift3自动转换之前从未见过此关键字……”

参见例如上述SE-0103改进建议的链接(以及beta 6发行说明中引用的文本):以前,默认情况下转义了闭包参数(因此,无需存在用于转义的显式注释),但默认情况下现在改为不转义。因此,添加@escaping来显式地注释一个闭包参数可以转义(与其默认行为相反)。这也解释了为什么@noescape现在不推荐使用(无需注释默认行为)。

为了解释闭包参数转义的含义,我引用了语言参考-attribute

“将此属性应用于方法或函数声明中的参数类型,以指示该参数的值可以存储以供以后执行。这意味着允许该值超过调用的生存期。”

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Swift 3嵌套函数与闭包

来自分类Dev

无法在Swift 3中使用闭包语法

来自分类Dev

链接闭包和完成处理程序 Swift 3

来自分类Dev

在Swift 3中自动将CGRectMake更新为CGRect

来自分类Dev

将闭包数组减少为单个闭包

来自分类常见问题

如何在Swift 3中记录函数的闭包参数的参数?

来自分类Dev

在Swift 3中是否可以通过闭包签名来重载静态方法?

来自分类Dev

API 响应闭包中的 iOS Swift 3 DispatchQueue.main.async()

来自分类Dev

将第3方库重新打包为NuGet包

来自分类Dev

Swift –将Stripe更新为21.0.1后,“没有这样的模块'Stripe3DS2'”

来自分类Dev

无法调用“ copyBytes”和“ C语言样式的Swift 3中的语句已被删除”尝试将项目更新为Swift 3

来自分类Dev

Swift通用闭包

来自分类Dev

在Swift闭包内更新的UILabel文本拒绝显示

来自分类Dev

将PHP cURL请求从SSLv3更新为TLS ..?

来自分类Dev

Swift:如何将闭包作为函数参数传递

来自分类Dev

将Objective-C块转换为Swift闭包

来自分类Dev

将Objective-C块转换为Swift闭包

来自分类Dev

Swift:将闭包作为类变量中的init参数

来自分类Dev

在Swift 3中将JSON对象解析为NSArray

来自分类Dev

Escaping in git add a leading "-" in the filename?

来自分类Dev

使用bash将专有音频包格式解码为mp3文件

来自分类Dev

在Swift中传递闭包

来自分类Dev

解释Swift闭包语法

来自分类Dev

在Swift中重用闭包

来自分类Dev

Swift特殊闭包语法

来自分类Dev

Swift Variadic闭包语法?

来自分类Dev

Swift通用闭包和

来自分类Dev

通用闭包的Swift数组?

来自分类Dev

Swift闭包通用参数