Swift 3:DispatchQueue.main.async{}和DispatcQueue.main.async(execute:{})的区别?

Swift 3: Difference between DispatchQueue.main.async{} and DispatcQueue.main.async(execute:{})?

两者之间的语义差异非常小,我发现自己想知道为什么这两个选项都存在。它们在功能上有什么不同,或者一个可能只是另一个的别名?

完全没有区别。事实上,它们是完全相同的方法。

编译器,

myQueue.async(execute: { foo() })

完全一样
myQueue.async {
  foo()
}

当任何函数或方法的最后一个参数是函数时,您可以将该参数作为尾随闭包传递,而不是将其传递到参数列表中。这样做是为了使 DispatchQueue.async 等高阶函数更像是语言的一部分,减少句法开销并简化领域特定语言的创建。

有关于尾随闭包语法的文档 here

顺便说一句,编写我的第一个示例的惯用方式是:

myQueue.async(execute: foo)

您指的是尾随闭包语法。它是使闭包更易于使用的语法糖。

还有许多其他类型的与闭包相关的语法糖功能,我在我的回答中介绍了这些

一如既往,我强烈推荐 Swift Language guide,它很好地解释了像这样的基础知识。