Capture de valeurs
Fait partie de la section Logique et Flux du Journey Swift de Coddy — leçon 40 sur 56.
Une closure mémorise les variables qui étaient à sa portée au moment de sa création. Le corps de la closure peut les lire et même les modifier plus tard, même après que la fonction parente s'est terminée. 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, de sorte que deux compteurs ne partagent jamais d'état :
let a = makeCounter()
let b = makeCounter()
print(a()) // 1
print(b()) // 1
print(a()) // 2La capture est ce qui rend les fermetures (closures) plus puissantes que les fonctions simples : elles transportent un état avec elles. Vous verrez la même astuce en JavaScript, en Python et dans de nombreux autres langages.
Défi
MoyenConstruisez une petite fabrique de compteurs.
Définissez une fonction makeCounter(start: Int, step: Int) qui retourne une closure de type () -> Int. Chaque appel à la closure retourne la valeur suivante : le premier appel retourne start, le suivant retourne 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
14Aide-mémoire
Les fermetures capturent les variables de leur portée environnante, conservant l'état même après le retour de la fonction parente :
func makeCounter() -> () -> Int {
var count = 0
return {
count += 1
return count
}
}
let next = makeCounter()
print(next()) // 1
print(next()) // 2Chaque appel à la fonction d'usine crée une variable capturée indépendante — deux compteurs ne partagent jamais d'état.
Essayez vous-même
let start = Int(readLine()!)!
let step = Int(readLine()!)!
let n = Int(readLine()!)!
// À FAIRE : 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 mots