给出:
typealias Action = () -> ()
var action: Action = { }
func doStuff(stuff: String, completion: @escaping Action) {
print(stuff)
action = completion
completion()
}
func doStuffAgain() {
print("again")
action()
}
doStuff(stuff: "do stuff") {
print("swift 3!")
}
doStuffAgain()
是否有任何方法可以使completion
类型的action
参数(和Action?
)并保持@escaping
?
更改类型会出现以下错误:
@转义属性仅适用于函数类型
删除@escaping
属性,代码会编译并运行,但由于completion
闭包使函数的作用范围变大,因此似乎并不正确。
[有SR-2552报告说@escaping
无法识别功能类型别名。这就是错误@escaping attribute only applies to function types
的原因。您可以通过扩展函数签名中的函数类型来解决:
我也遇到类似的问题,因为混用@escaping和non @escaping非常令人困惑,尤其是在需要传递闭包的情况下。我最终得到了默认参数(我认为更合理)
我以这种方式使它在Swift 3中正常运行而没有任何警告:
该示例中要理解的重要一点是,如果将Action
更改为Action?
,则闭包is