2017-04-11 4 views

Répondre

1

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.

11

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) 
+0

Dans ce cas, vous pouvez aussi faire: 'myQueue.async (execute: foo)' :) – Alexander

+0

J'ai essayé de rendre le parallèle plus évident, mais oui, ce serait la façon la plus idiomatique :) –