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()) // 3Ogni 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()) // 2La 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.
Sfida
MedioCrea 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
14Provalo 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
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Le stringhe in dettaglio
Conteggio e indiciMaiuscole, minuscole e rimozione degli spaziRicerca nelle stringheSuddivisione e unioneSostituzione di sottostringheRiepilogo - Verifica del nome utente4Insiemi
Creare insiemiUnione e intersezioneDifferenza e differenza simmetricaSottoinsieme e sovrainsiemeRiepilogo - Filtro per tag7Progetto - Tracciatore di abitudini
Panoramica del progettoSegna come completato10Progetto - Motore di quiz
Panoramica del progettoPorre domande2Intervalli e passi
Intervalli chiusi e semiapertiPassoMetodi degli intervalliIntervalli in switchRiepilogo - Griglia del calendario5Funzioni di ordine superiore Parte 1
MapFilterReduceConcatenare map, filter e reduceRiepilogo - Statistiche sulle paroleEsercitati da solo: Playground Swift