Capture de valeurs
Fait partie de la section Logique et Flux du Journey Swift de Coddy. Leçon 40 sur 56.
Une fermeture mémorise les variables qui étaient dans sa portée au moment de sa création. Le corps de la fermeture peut les lire et même les modifier ultérieurement, y compris après le retour de la fonction environnante. C’est ce qu’on appelle la capture.
func makeCounter() -> () -> Int {
var count = 0
return {
count += 1
return count
}
}
let next = makeCounter()
print(next()) // 1
print(next()) // 2
print(next()) // 3Chaque appel à makeCounter vous donne un tout nouveau count, ainsi deux compteurs ne partagent jamais leur état :
let a = makeCounter()
let b = makeCounter()
print(a()) // 1
print(b()) // 1
print(a()) // 2La capture est ce qui rend les clôtures plus puissantes que les fonctions ordinaires : elles emportent leur état avec elles. Tu retrouveras la même astuce en JavaScript, Python et dans de nombreux autres langages.
Défi
MoyenCréez une petite fabrique de compteurs.
Définissez une fonction makeCounter(start: Int, step: Int) qui renvoie une fermeture de type () -> Int. Chaque appel de la fermeture renvoie la valeur suivante : le premier appel renvoie start, le suivant renvoie start + step, le suivant start + 2*step, et ainsi de suite.
Lisez trois entiers depuis l’entrée : start, step et n. Construisez un compteur avec start et step, puis appelez-le n fois et affichez chaque résultat sur sa propre ligne.
Pour l’entrée 5 / 3 / 4, la sortie est :
5
8
11
14Essayez vous-même
let start = Int(readLine()!)!
let step = Int(readLine()!)!
let n = Int(readLine()!)!
// TODO: makeCounter(start:step:) -> () -> Int qui capture la valeur courante
// puis l'appeler n fois et afficher chaque résultat
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