Menu
Coddy logo textTech

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())                    // 3

Chaque 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())                       // 2

La 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.

challenge icon

Défi

Moyen

Construisez 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
14

Aide-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()) // 2

Chaque 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
quiz iconTestez-vous

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