- Mar 14, 2025
[14/16] Qu’est-ce qu’une closure ?
Introduction
En programmation Swift, il arrive très souvent que l’on ait besoin de passer du code en tant que valeur. Cela peut paraître étrange au premier abord, mais imaginez que vous puissiez transmettre une fonction comme si c’était une variable. C’est exactement ce que permettent les closures.
Une closure est un bloc de code autonome que vous pouvez stocker dans une variable, passer en paramètre, ou encore utiliser plus tard. C’est un concept puissant, mais souvent impressionnant au début. Dans ce chapitre, nous allons démystifier les closures en les expliquant simplement, avec des métaphores et des exemples concrets.
Définition d’une closure
Une closure est un bloc de code réutilisable, comme une fonction sans nom, que vous pouvez manipuler comme une valeur.
let direBonjour = {
print("Bonjour à tous !")
}
direBonjour() // Appel de la closure
Ici, direBonjour est une variable qui contient une closure. Vous pouvez l’exécuter en ajoutant () à la fin.
📌 Les closures peuvent capturer et utiliser des variables depuis leur environnement.
Syntaxe avec paramètres
Tout comme une fonction, une closure peut accepter des paramètres et retourner une valeur :
let addition = { (a: Int, b: Int) -> Int in
return a + b
}
let resultat = addition(3, 5)
print(resultat) // Affiche : 8
Explication :
(a: Int, b: Int): les paramètres de la closure,> Int: le type de retour,in: sépare la signature de la closure de son corps.
À quoi servent les closures ?
Les closures sont utiles dans plusieurs cas :
Passer une action personnalisée en paramètre d’une fonction ou d’une méthode.
Déclencher un comportement plus tard, comme une animation ou une réponse à une action utilisateur.
Filtrer ou transformer des données dans des tableaux.
Prenons un exemple. Supposons que vous souhaitiez animer un bouton dans votre interface, puis afficher un message une fois l’animation terminée :
func animer(completion: () -> Void) {
print("Animation en cours...")
completion()
}
animer {
print("Animation terminée !")
}
Ici, vous passez une closure en paramètre à la fonction animer, qui appelle cette closure à la fin.
Closures et tableaux
Les closures sont très utilisées avec les méthodes de manipulation de tableaux, comme map, filter, sorted...
Un exemple classique est celui permettant de trier un tableau avec la méthode .sort() :
let numbers = [3, 1, 4, 2]
let sortedNumbers = numbers.sorted(by: { (a, b) -> Bool in
return a < b
})
print(sortedNumbers) // Affiche : [1, 2, 3, 4]
Vous passez une closure à sorted pour définir comment comparer deux éléments.
En Swift, on peut simplifier la syntaxe des closures avec l’inférence de types et les paramètres implicites $0, $1, etc.
let triés = nombres.sorted { $0 < $1 }
Même résultat, avec une syntaxe beaucoup plus concise.
Exemple : système de filtre
Imaginons que vous développiez une app de recettes. Vous souhaitez filtrer les recettes végétariennes à partir d’une liste :
struct Recette {
let nom: String
let estVegetarienne: Bool
}
let recettes = [
Recette(nom: "Lasagnes", estVegetarienne: false),
Recette(nom: "Salade grecque", estVegetarienne: true),
Recette(nom: "Curry de légumes", estVegetarienne: true)
]
let vegetariennes = recettes.filter { $0.estVegetarienne }
for recette in vegetariennes {
print(recette.nom)
}
Résultat :
Salade grecque
Curry de légumes
La méthode filter utilise une closure pour ne garder que les recettes qui remplissent une condition.
Conclusion
Les closures sont des blocs de code que vous pouvez stocker, transmettre, et exécuter plus tard. Même si elles peuvent sembler complexes au départ, elles deviennent vite indispensables pour écrire du code Swift élégant, flexible et expressif.
Dans ce chapitre, vous avez appris à :
créer une closure simple,
y ajouter des paramètres et un retour,
les utiliser avec des fonctions ou des méthodes,
les combiner avec des tableaux pour trier, filtrer, transformer.
✅ Les closures sont la base de nombreux patterns modernes en Swift. En les comprenant, vous progressez vers une meilleure maîtrise du langage.