Closures finales
Fait partie de la section Logique et Flux du Journey Swift de Coddy. Leçon 39 sur 56.
Lorsqu’une closure est le dernier argument d’une fonction, vous pouvez l’écrire en dehors des parenthèses. C’est la forme trailing-closure, et c’est ainsi que le code Swift se lit naturellement.
let nums = [1, 2, 3]
// Forme standard
let a = nums.map({ $0 * 2 })
// Forme avec fermeture traînante
let b = nums.map { $0 * 2 }Si la closure est le seul argument, les parenthèses disparaissent également. C'est pourquoi tout ce que vous avez vu jusqu'à présent se lit comme une structure de contrôle personnalisée.
Vous pouvez écrire vos propres fonctions pour recevoir des clôtures de la même manière :
func repeatN(_ n: Int, action: () -> Void) {
for _ in 0..<n {
action()
}
}
repeatN(3) {
print("hi")
}La forme avec fermeture en suffixe fait que repeatN(3) { ... } se lit comme une boucle intégrée. C’est tout l’intérêt : les structures de contrôle que tu construis toi-même ressemblent exactement à celles de la bibliothèque standard.
Défi
FacileDéfinissez une fonction collect qui :
- prend un entier
net une fermeturebuilder: (Int) -> String - appelle
builderpour chaqueide1àninclus et renvoie le tableau des chaînes obtenues
Lisez un entier depuis stdin, appelez collect avec cet entier en utilisant une fermeture finale qui produit "i=<i>" pour chaque valeur, puis affichez le résultat joint avec ,.
Pour l’entrée 4, la sortie est i=1,i=2,i=3,i=4.
Essayez vous-même
let n = Int(readLine()!)!
// TODO: func collect(_ n:Int, builder:(Int)->String) -> [String]
// ensuite appeler collect(n) { ... } et afficher le résultat joint par ","
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique et Flux
1Les chaînes de caractères en profondeur
Comptage et indicesCasse et nettoyageRecherche dans les chaînesDécoupage et jointureRemplacement de sous-chaînesRécapitulatif - Vérification du nom d'utilisateur4Ensembles
Création d'ensemblesUnion et intersectionSoustraction et différence symétriqueSous-ensemble et sur-ensembleRécapitulatif - Filtre de tags7Projet - Suivi d'habitudes
Aperçu du projetMarquer comme terminé10Projet - Moteur de quiz
Présentation du projetPoser des questions2Intervalles et Pas
Fermé vs Semi-ouvertLe PasMéthodes d'intervalleIntervalles dans un SwitchRécapitulatif - Grille de calendrier5Fonctions d'ordre supérieur, Partie 1
MapFilterReduceChaînage de map, filter, reduceRécapitulatif - Statistiques de motsEntraînez-vous par vous-même : Playground Swift