两者之间存在非常狭窄的语义差异,我发现自己想知道为什么两种选择都存在。它们在功能上是否有任何不同,或者可能只是另一个的别名?
答案 0 :(得分:12)
完全没有区别。事实上,它们是完全相同的方法。
编译器,
myQueue.async(execute: { foo() })
与
完全相同myQueue.async {
foo()
}
当任何函数或方法的最后一个参数是函数时,您可以将该参数作为尾随闭包传递,而不是将其传递到参数列表中。这样做是为了使诸如DispatchQueue.async
之类的高阶函数更像是语言的一部分,减少语法开销并简化域特定语言的创建。
关于尾随闭包语法here的文档。
顺便说一下,写我的第一个例子的惯用方法是:
myQueue.async(execute: foo)
答案 1 :(得分:2)
您所指的是尾随闭包语法。它是使闭合更容易使用的语法糖。
还有许多与闭包有关的语法糖功能,我在回答here中介绍了这些功能。
与往常一样,我强烈推荐Swift Language guide,它在解释这样的基础知识方面做得很好。