是否可以在swift中使用多个尾部闭包?

时间:2014-06-08 17:51:20

标签: swift

我知道可以定义接受这样的闭包的方法:

一个。单闭合作为输入参数

func testOfClosures (flag: Int, closure1: () -> ())
{
     closure1()
}

B中。多个闭包作为输入参数

func testOfClosures (flag: Int, closure1: () -> (), closure2: () -> (), closure3: () ->  ())
{
    switch flag
    {
        case 1:
             closure1()
        case 2:
             closure2()
        default:
             closure3()
    }
}

有趣的是,在第一种情况下,我们可以像这样调用它:

testOfClosures(1){
    println("print closure 1")
}

但在第二种情况下,我们不能像这样调用它:

testOfClosures(1,{
    println("print closure 1")
},
{
    println("print closure 2")
})
{
    println("print closure 3")
}

我们必须像这样调用它:

testOfClosures(1,{
    println("print closure 1")
},
{
    println("print closure 2")
},
{
    println("print closure 3")
})

有什么理由吗?

2 个答案:

答案 0 :(得分:5)

看起来尾随闭包语法对开头{的位置非常具体,并要求它与结束)

在同一行

以下作品

testOfClosures(1,{
    println("print closure 1")
},
{
    println("print closure 2")
}) {
    println("print closure 3")
}

就多个尾随闭包而言,这是不可能的。该文档仅使用特殊语法将最终闭包声明。

答案 1 :(得分:3)

是的,自 Swift 5.3 开始,您就可以这样做。

请参见此示例

// Multiple trailing closure arguments
UIView.animate(withDuration: 0.3) {
  self.view.alpha = 0
} completion: { _ in
  self.view.removeFromSuperview()
}

Proposal

中的信用和更多信息