能否在 Swift 中使用多个尾随闭包?

5

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

A. 单一闭包作为输入参数

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")
})

有什么原因吗?

除了“因为他们这么说”,其他都是观点。尾随闭包的简写符号仅适用于单个最后一个参数,已有文档记录。 - David Berry
2个回答

6

自从Swift 5.3以来,您可以这样做。

请看以下示例:

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

详细信息和原始方案请查看GitHub


4

看起来尾随闭包语法对于开头的 { 的位置非常具体,需要与结尾的 ) 在同一行。

以下代码可以正常工作:

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

就多个尾随闭包而言,是不可能的。文档明确指出只有最后一个闭包使用特殊语法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接