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

问题描述:

我很好奇这些语法陈述中哪一个是(更正确的)。 游乐场愉快地编译这两种情况。swift中不同类型的闭包语法 - 哪一个是正确的?

方法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

这两种方法之间的差异被以下:

方法1:普通闭合

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

如果你错过了completion标签,你可以自由地喜欢这类型的:

UIView.animate(withDuration: 3.0, animations: { 

}) {(completion: Bool) in 

} 

对于你的问题结束还有:这是一个功能相同的相同的实现,但不同的语法

+1

正想这么说,但你说好听。使用尾随闭包的好处是它通常会产生更清晰的代码。 – picciano

+0

好了之后,我再次看了一遍,它看起来对我来说更干净:)谢谢。 – GiorgioE

两者都是正确的。

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

  2. 它代表一个拖尾关闭

如果你需要一个封闭表达式传递给函数作为 函数的最后一个参数和封盖表现为长,它可以 是它写成一个尾部,而不是封有用。尾随 闭包在函数调用的括号后面写入,尽管它仍然是该函数的参数。当您使用尾随的 闭包语法时,您不会将闭包的参数标签写为 函数调用的一部分。

你可以阅读更多关于关闭尾随从https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

+1

谢谢,所以我们不应该写arg。尾随封闭内的标签?或者只是不需要? – GiorgioE

+2

没有用于使用尾随闭包来写参数标签的范围。 “完成:”不需要写。尾随闭包的主体写在方法调用括号之外,即UIView.animate(...){尾随闭包体} – PGDev