微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift可选的转义闭包参数

如何解决Swift可选的转义闭包参数

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

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 beta版本下,但尚未解决bugSR-2552。修复了该错误,并引入了一个仍在打开的新错误(您面临的错误)。参见SR-2444

解决方法 @迈克尔Ilseman 指出作为临时解决方案是去除@escaping从可选功能类型的属性, 。

func doStuff(stuff: String, completion: Action?) {...}

::

SR-2444已经被关闭,说明明确,在参数位置关闭 逃逸,需要他们被打上@escaping让他们逃脱,但可选参数 隐含逃避,因为((Int)->())?是同义词Optional<(Int)->()>,可选的闭包逃跑。

解决方法

鉴于:

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属性仅适用于函数类型

删除该@escaping属性后,代码将编译并运行,但由于completion闭包使函数的作用范围变大,因此似乎并不正确。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。