ProgrammationDéveloppeur iOS, Junior/Middle

Qu'est-ce que la syntaxe de closure en trailing dans Swift, pourquoi a-t-elle été introduite et quelles sont ses caractéristiques et limitations ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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 :

  • Améliore la lisibilité du code avec des closures
  • Particulièrement pratique lors du travail avec des DSL fonctionnels et déclaratifs (SwiftUI, animation UIKit)
  • Limitée au dernier paramètre de closure de la fonction

Questions pièges.

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

Erreurs courantes et anti-modèles

  • Ils confondent l'ordre des paramètres de closure et essaient de sortir une closure qui n'est pas la dernière
  • Ils laissent les closures anonymes trop complexes, diminuant la lisibilité
  • Ils utilisent la closure en trailing dans des situations où cela nuit à la révision PR (par exemple, lors de courtes closures)

Exemple de la vie réelle

Cas négatif

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 :

  • Indication explicite de chaque closure

Inconvénients :

  • Lisibilité réduite, répétition des parenthèses

Cas positif

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 :

  • Amélioration de la perception, révision rapide

Inconvénients :

  • Les débutants doivent s'habituer à une syntaxe non standard