Il y a une différence sémantique très étroite entre les deux, et je me demande pourquoi les deux options existent. Sont-ils différents d'un point de vue fonctionnel, ou est-ce seulement un alias de l'autre?Swift 3: Différence entre DispatchQueue.main.async {} et DispatcQueue.main.async (execute: {})?
Répondre
Ce que vous faites référence est appelée arrière syntaxe de fermeture. C'est un sucre syntaxique pour rendre les fermetures plus faciles à travailler.
Il y a beaucoup d'autres types de caractéristiques syntaxiques du sucre qui se rapportent aux fermetures, que je couvre dans ma réponse here.
Comme toujours, je recommande fortement le Swift Language guide, qui explique parfaitement les bases comme ceci.
Il n'y a pas de différence du tout. Ils sont, en fait, la même méthode.
au compilateur,
myQueue.async(execute: { foo() })
est exactement le même que
myQueue.async {
foo()
}
Lorsque le dernier argument d'une fonction ou méthode est une fonction, vous pouvez passer cet argument comme une fermeture de fuite à la place de le passer à l'intérieur de la liste des arguments. Ceci est fait pour que les fonctions d'ordre supérieur telles que DispatchQueue.async
se sentent plus comme une partie du langage, réduisent la surcharge syntaxique et facilitent la création de langages spécifiques au domaine.
Il existe une documentation sur la syntaxe de fermeture arrière here.
Et en passant, la façon idiomatiques d'écrire mon premier exemple serait:
myQueue.async(execute: foo)
Dans ce cas, vous pouvez aussi faire: 'myQueue.async (execute: foo)' :) – Alexander
J'ai essayé de rendre le parallèle plus évident, mais oui, ce serait la façon la plus idiomatique :) –