加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

function – Swift 3可选转义闭包参数

发布时间:2020-12-14 05:59:34 所属栏目:百科 来源:网络整理
导读:给定: 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") { pr
给定:
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?

更改类型会出现以下错误:

错误:@escaping属性仅适用于函数类型

删除@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?) {...}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读