Les bases des closures
Fait partie de la section Logique et Flux du Journey Swift de Coddy — leçon 38 sur 56.
Une closure est un bloc de code autonome que vous pouvez transmettre et appeler plus tard. La syntaxe complète précise les types de paramètres et de retour :
let double = { (n: Int) -> Int in
return n * 2
}
print(double(5)) // 10Swift peut inférer les types lorsque le contexte est clair, vous écrirez donc rarement la forme longue. À l'intérieur de map, filter, etc., la syntaxe raccourcie est la norme :
let nums = [1, 2, 3, 4]
let doubled = nums.map { n in n * 2 }
let alsoDoubled = nums.map { $0 * 2 } // le plus court, $0 est le premier argumentLes closures sont des valeurs, vous pouvez les stocker dans des variables, les retourner depuis des fonctions et les passer en tant qu'arguments. C'est la raison même pour laquelle map fonctionne.
Défi
FacileLisez deux lignes d'entrée :
- Un entier
x - Une liste d'entiers séparés par des virgules
Définissez trois fermetures (closures), chacune de type (Int) -> Int :
addXajoutexà son argumentsquareretourne l'argument au carrénegateretourne l'argument opposé (négatif)
Appliquez chaque fermeture à chaque élément de la liste en utilisant map. Affichez trois lignes, une par fermeture, avec les résultats joints par , :
addX: ...
square: ...
negate: ...Pour l'entrée 10 sur la ligne 1 et 1,2,3 sur la ligne 2, la sortie est :
addX: 11,12,13
square: 1,4,9
negate: -1,-2,-3Aide-mémoire
Une closure est un bloc de code autonome qui peut être stocké et transmis. Syntaxe complète :
let double = { (n: Int) -> Int in
return n * 2
}Les closures peuvent être stockées dans des variables et transmises comme arguments (par exemple à map). Swift infère les types selon le contexte, permettant une syntaxe raccourcie :
let nums = [1, 2, 3, 4]
let doubled = nums.map { n in n * 2 }
let alsoDoubled = nums.map { $0 * 2 } // $0 est le premier argumentEssayez vous-même
let x = Int(readLine()!)!
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
// TODO: définir trois closures (Int) -> Int et mapper nums à travers chacune
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 mots8Closures
Les bases des closuresClosures finalesCapture de valeursRetourner des closuresOrdre supérieur personnaliséRécapitulatif - Pipeline Builder