给定:
- 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()
有什么为什么要使类型Action的完成参数(和动作)?并保持@escaping?
更改类型会出现以下错误:
有一个
SR-2552报告,@escaping不识别功能类型别名。这就是为什么错误@escaping属性只适用于函数类型。您可以通过扩展函数签名中的函数类型来解决:
- typealias Action = () -> ()
- var action: Action? = { }
- func doStuff(stuff: String,completion: (@escaping ()->())?) {
- print(stuff)
- action = completion
- completion?()
- }
- func doStuffAgain() {
- print("again")
- action?()
- }
- doStuff(stuff: "do stuff") {
- print("swift 3!")
- }
- doStuffAgain()
编辑::
我实际上是在一个xcode 8测试版,其中bug SR-2552还没有解决。修复这个bug,介绍一个新的(你面对的),仍然是开放的。见SR-2444。
解决方法迈克尔Ilseman指出作为一个临时解决方案是从可选的函数类型删除@escaping属性,保持函数作为转义。
- func doStuff(stuff: String,completion: Action?) {...}