我已经将代码更新为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
}
任何帮助,不胜感激!
在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] 删除。
我来说两句