将可变参数闭包参数标记为转义

时间:2018-01-15 16:49:59

标签: swift closures

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

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

然后将其变为@escaping,如

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

产生以下错误。

  

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

中使用

1 个答案:

答案 0 :(得分:2)

您根本不需要使用@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()