Menu
Coddy logo textTech

Catturare i valori

Fa parte della sezione Logica e flusso del percorso Swift di Coddy. Lezione 40 di 56.

Una closure ricorda le variabili che erano nell'ambito quando è stata creata. Il corpo della closure può leggerle e persino modificarle in seguito, anche dopo che la funzione circostante è terminata. Questo si chiama cattura.

func makeCounter() -> () -> Int {
    var count = 0
    return {
        count += 1
        return count
    }
}

let next = makeCounter()
print(next())                    // 1
print(next())                    // 2
print(next())                    // 3

Ogni chiamata a makeCounter ti dà un nuovo count, quindi due contatori non condividono mai lo stato:

let a = makeCounter()
let b = makeCounter()
print(a())                       // 1
print(b())                       // 1
print(a())                       // 2

La cattura è ciò che rende le chiusure più potenti delle semplici funzioni: portano con sé uno stato. Vedrai lo stesso trucco in JavaScript, Python e molti altri linguaggi.

challenge icon

Sfida

Medio

Crea una piccola fabbrica di contatori.

Definisci una funzione makeCounter(start: Int, step: Int) che restituisce una closure di tipo () -> Int. Ogni chiamata alla closure restituisce il valore successivo: la prima chiamata restituisce start, la successiva restituisce start + step, la successiva start + 2*step e così via.

Leggi tre numeri interi dall'input: start, step e n. Crea un contatore con start e step, poi chiamalo n volte e stampa ogni risultato su una riga separata.

Per l'input 5 / 3 / 4, l'output è:

5
8
11
14

Provalo tu

let start = Int(readLine()!)!
let step = Int(readLine()!)!
let n = Int(readLine()!)!

// TODO: crea makeCounter(start:step:) -> () -> Int che catturi il valore corrente
// poi chiamala n volte e stampa ogni risultato
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Playground Swift