Historique de la question : La syntaxe de closure en trailing est une construction syntaxique de Swift introduite pour améliorer la lisibilité du code lors de l'utilisation de blocs (closures) de fin de fonction. Elle facilite le travail avec de grands et imbriqués closures, en particulier dans un style fonctionnel et déclaratif.
Problème : La déclaration standard des closures avec de nombreuses parenthèses complique la structure visuelle du code, le rend moins compréhensible :
UIView.animate(withDuration: 0.3, animations: { ... })
Avec la taille croissante des closures, ce code devient moins lisible.
Solution : Swift permet de sortir le dernier argument-fonction des parenthèses :
UIView.animate(withDuration: 0.3) { // bloc d'animation }
Si plusieurs closures sont présentes, la syntaxe de closure en trailing n'est possible que pour le dernier paramètre de closure, les autres doivent être spécifiées dans des parenthèses.
Caractéristiques clés :
Peut-on appliquer la syntaxe de closure en trailing si la closure n’est pas le dernier paramètre de la fonction ?
Non, seul le dernier paramètre peut être formaté en trailing closure. Si plusieurs closures sont nécessaires, seul le dernier peut être placé après les parenthèses, les autres doivent être passées à l'intérieur des parenthèses.
func fetch(url: String, completion: () -> Void, onError: () -> Void) fetch(url: "...", completion: { ... }) { // onError }
Peut-on omettre les parenthèses lors de l'appel d'une méthode avec un seul argument-closure ?
Oui, si la fonction prend un unique argument qui est une closure, les parenthèses peuvent être complètement omises :
func doWork(action: () -> Void) doWork { print("Tâche") }
Peut-on utiliser une closure en trailing pour des fonctions avec des paramètres variadiques après les closures ?
Non, la syntaxe de closure en trailing n'est applicable que si la closure est le dernier argument. Aucun paramètre variadique ou d'autres ne peuvent suivre. Cela va déclencher une erreur :
func test(x: () -> Void, y: Int...) // ... appel impossible avec closure en trailing
Appel avec deux paramètres de closure sans syntaxe de trailing, ce qui fait que la méthode occupe 5 écrans en vertical, augmentant la difficulté de compréhension.
Avantages :
Inconvénients :
Dans la mise en œuvre de UICollectionViewCompositionalLayout, une closure en trailing est utilisée — le bloc de mise en page est facile à lire, la structure affiche visuellement l'hierarchie des composants de mise en page.
Avantages :
Inconvénients :