【问题标题】:Marking a variadic closure parameter as escaping将可变参数闭包参数标记为转义
【发布时间】:2018-01-15 16:49:58
【问题描述】:

假设@nonescaping 可变参数闭包参数如

func method(_ closures: () -> Void...)

然后将其更改为@escaping,如下所示

func method(_ closures: @escaping () -> Void...)

产生以下错误。

@escaping 属性只能用在函数参数位置

【问题讨论】:

  • func method(_ closures: [@escaping () -> Void]) 产生与 Swift 4 相同的错误。
  • 这是一个编译时错误。据我所见,@escaping@autoclosure 仅由函数类型支持。 编辑:我正在回复 Özgür Ersil 现已删除的评论。

标签: swift closures


【解决方案1】:

您根本不需要在这里使用@escaping。只有直接作为参数的闭包(没有任何包装)可以是非转义的。

作为可变参数一部分的闭包(在幕后)被包裹在 Array 中,因此它已经隐含为 @escaping

例如,这个编译和运行得很好:

class MyObject {

    var closures: [() -> ()] = []

    func add(_ closures: () -> () ...) {
        self.closures += closures
    }

    func run() {
        for closure in closures { closure() }
    }

}

let object = MyObject()
object.add({ print("first") }, { print("second") })
object.run()

【讨论】:

    猜你喜欢
    • 2016-04-29
    • 2017-01-29
    • 2012-12-31
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多