swift中不同类型的闭包语法 - 哪一个是正确的?

时间:2016-09-22 15:21:13

标签: ios swift closures swift3 completionhandler

我很好奇这些语法陈述中哪一个(更)正确。 游乐场愉快地编写了两个案例。

方法1

// copied from SO and this appears clear to me
UIView.animate(
    withDuration: 3.0,
    animations: {

    },
    completion: { (Bool) in
        // completion code
    }
)

方法2

UIView.animate(
    withDuration: 3.0,
    animations: {

        // code

    }) {(Bool) in
      // code when finished?
      // argument label completion missing?
    }

为什么第二种方法中的圆括号在最后一个参数说明之前被关闭?或者是UIView.animation的另一种实现?

2 个答案:

答案 0 :(得分:6)

两者都是正确的。

  1. 这是函数调用中常用的闭包语法。

  2. 它代表追踪关闭

  3.   

    如果需要将闭包表达式传递给函数作为   函数的最终参数和闭包表达式很长,它可以   相反,将它写为尾随闭包很有用。落后   尽管如此,在函数调用的括号之后写入闭包   它仍然是函数的一个参数。当你使用尾随   关闭语法,你不要将闭包的参数标签写为   函数调用的一部分。

    您可以从https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

    了解有关尾随闭包的更多信息

答案 1 :(得分:4)

两种方法的区别如下:

方法1: 常规 关闭

方法2: 尾随关闭 。 函数签名中的最后闭包参数可以用较短的语法编写。如果第二个参数是completion,并且animations参数将是最后一个,则尾随闭包将应用于动画等。 所以它必须作为最后一个(或唯一的)闭包参数。

如果您错过completion标签,可以这样输入:

UIView.animate(withDuration: 3.0, animations: {

 }) {(completion: Bool) in

 }

也是为了完成您的问题:它是相同功能的相同实现,但语法不同