Swift可选的转义结束符

问题描述 投票:151回答:5

给出:

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闭包使函数的作用范围变大,因此似乎并不正确。

swift function closures optional
5个回答
113
投票

[有SR-2552报告说@escaping无法识别功能类型别名。这就是错误@escaping attribute only applies to function types的原因。您可以通过扩展函数签名中的函数类型来解决:


208
投票

17
投票

我也遇到类似的问题,因为混用@escaping和non @escaping非常令人困惑,尤其是在需要传递闭包的情况下。我最终得到了默认参数(我认为更合理)


17
投票

我以这种方式使它在Swift 3中正常运行而没有任何警告:


4
投票

该示例中要理解的重要一点是,如果将Action更改为Action?,则闭包is

© www.soinside.com 2019 - 2024. All rights reserved.