Cattura dei valori per riferimento
Comprendi come le closure catturano lo stato circostante.
Cattura dei valori per riferimento è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Swift Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Swift Academy include 4 lezioni in totale.
Cosa catturano le closure
Una closure cattura le variabili e le costanti dello scope circostante a cui fa riferimento. Le variabili catturate vengono mantenute per riferimento, quindi la closure vede le modifiche successive.
Catturare una costante
La closure ricorda greeting anche dopo la restituzione della funzione:
func makeGreeter() -> () -> String {
let greeting = "Hello"
return { greeting }
}
let greet = makeGreeter()
print(greet()) // "Hello"Catturare una variabile per riferimento
Poiché count è una var, la closure modifica la stessa area di memoria tra una chiamata e l'altra:
func makeCounter() -> () -> Int {
var count = 0
return {
count += 1
return count
}
}
let next = makeCounter()
print(next(), next(), next()) // 1 2 3Memoria condivisa
Due closure possono catturare la stessa variabile e vedere le modifiche apportate dall'altra:
func makePair() -> (() -> Void, () -> Int) {
var value = 0
let inc = { value += 1 }
let read = { value }
return (inc, read)
}
let (inc, read) = makePair()
inc(); inc()
print(read()) // 2La cattura riflette le modifiche successive
La closure legge il valore corrente della variabile al momento della chiamata, non il valore che aveva quando la closure è stata creata:
var message = "first"
let show = { print(message) }
message = "second"
show() // "second"Cattura per riferimento o per valore
Per impostazione predefinita, una variabile mutabile viene catturata per riferimento. Se desidera una copia congelata del suo valore al momento della creazione, la elenchi in una capture list come [x].
Congelare un valore
Una capture list copia immediatamente il valore:
var n = 10
let frozen = { [n] in n } // copies 10 now
n = 99
print(frozen()) // 10Ogni closure ha uno stato indipendente
Ogni chiamata alla factory crea una nuova variabile catturata:
func counter() -> () -> Int {
var c = 0
return { c += 1; return c }
}
let a = counter(), b = counter()
print(a(), a(), b()) // 1 2 1Catturare in un ciclo
Senza la dovuta attenzione, le closure in un ciclo possono condividere la stessa variabile. Usi una capture list per salvare un valore indipendente a ogni iterazione:
var closures: [() -> Int] = []
for i in 1...3 {
closures.append { [i] in i }
}
print(closures.map { $0() }) // [1, 2, 3]Catturare self in un metodo
Una closure creata all'interno di un metodo cattura l'istanza circostante, permettendole di leggere e modificare le proprietà in un secondo momento:
class Bank {
var balance = 0
func deposit() -> () -> Void {
return { self.balance += 10 }
}
}
let bank = Bank()
let add = bank.deposit()
add(); add()
print(bank.balance) // 20Perché è importante
La cattura per riferimento abilita contatori, accumulatori e callback con stato — ma significa anche che una closure può mantenere in vita gli oggetti; il problema verrà gestito con le capture list nel prossimo argomento.
func accumulator() -> (Int) -> Int {
var total = 0
return { total += $0; return total }
}
let add = accumulator()
print(add(10), add(5)) // 10 15Verifica rapida
Come viene catturata per impostazione predefinita una variabile mutabile da una closure?
Riepilogo
Ha imparato la semantica delle catture:
- Le closure catturano le variabili a cui fanno riferimento nel proprio scope
- Le var mutabili vengono catturate per riferimento — modifiche e mutazioni sono condivise
- Una capture list
[x]congela una copia del valore al momento della creazione - Questo meccanismo abilita contatori e callback con stato
Prossimo argomento: closure escaping.
Domande Frequenti
La lezione «Cattura dei valori per riferimento» è gratuita?
Sì — il testo completo di «Cattura dei valori per riferimento» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Swift Academy, passa a CoddyKit PRO. Il corso Swift Academy include 4 lezioni in totale.
Cosa imparerò in «Cattura dei valori per riferimento»?
Comprendi come le closure catturano lo stato circostante. Eserciti Swift Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Swift Academy?
Non è richiesta alcuna esperienza precedente. Swift Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Cattura dei valori per riferimento»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Swift Academy?
Sì. Ogni lezione Swift Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Cattura dei valori per riferimento
- Closure escaping
- Liste di cattura e weak self
- Autoclosure