0Pricing
Swift Academy · Lezione

Liste di cattura — weak/unowned e cattura dei valori

Utilizzi le liste di cattura per controllare il modo in cui le closure catturano riferimenti e valori: [weak self], unowned e snapshot dei valori per evitare cicli di mantenimento e bug difficili da individuare.

Liste di cattura — weak/unowned e cattura dei valori è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 2 di 3. 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 3 lezioni in totale.

Perché usare le capture list?

Obiettivo: controllare che cosa cattura una closure e come lo cattura. Usi [weak self] o unowned per evitare i retain cycle e catturi snapshot dei valori quando necessario.

Cattura forte = rischio di ciclo

Le closure escaping o memorizzate mantengono i valori catturati. Catturare self in modo forte in questo caso può creare un retain cycle.

class Owner {
    var name = "Owner"
    var onDone: (() -> Void)?

    func start() {
        // Strong capture of self can cause a cycle if onDone is stored:
        onDone = {
            print("Done by", self.name) // self captured strongly
        }
    }
}
var o: Owner? = Owner()
o?.start()
// If nothing nils onDone or o, both can keep each other alive.

Schema di cattura debole

Usi [weak self] per interrompere il ciclo. self è opzionale all'interno della closure; lo scolleghi con guard let o l'optional chaining.

class Owner2 {
    var name = "Owner2"
    var onDone: (() -> Void)?

    func start() {
        onDone = { [weak self] in
            guard let self = self else { return }  // safely unwrap optional self
            print("Done by", self.name)
        }
    }
}
let o2 = Owner2()
o2.start()
o2.onDone?()

unowned (usare con cautela)

unowned presuppone che self sopravviva alla closure (non opzionale). Lo usi solo quando è certo che non possa essere nil al momento della chiamata.

class Owner3 {
    var onDone: (() -> Void)?
    func work() {
        onDone = { [unowned self] in
            // self must be alive when this runs; otherwise crash
            print("Owner3 still alive")
        }
    }
}
let o3 = Owner3()
o3.work()
o3.onDone?()

Concetto di snapshot del valore

Le capture list possono creare uno snapshot dei valori (ad esempio, [n = count]). Senza una capture list, le costanti let interne vengono comunque catturate al momento della creazione.

var count = 0
let makeLogger: () -> () -> Void = {
    let snapshot = count     // captured by value at creation
    return {
        print("snapshot =", snapshot, "current =", count)
    }
}
count = 10
let logger = makeLogger()
count = 20
logger()   // snapshot = 10, current = 20

Associazione di un valore nella capture list

Usi una capture list per creare uno snapshot con nome di un valore (ad esempio, [initial = total]) al momento della creazione della closure.

var total = 5
let closure = { [initial = total] in
    print("initial:", initial, " now:", total)
}
total = 9
closure()   // initial uses captured value 5

Perché usare weak self

Verifica rapida: perché aggiungere [weak self] a una closure memorizzata o escaping?

Riepilogo

Riepilogo: usi [weak self] per interrompere i cicli (self diventa opzionale), unowned solo quando la durata è garantita e catturi snapshot dei valori con associazioni nella capture list.

Domande Frequenti

La lezione «Liste di cattura — weak/unowned e cattura dei valori» è gratuita?

Sì — il testo completo di «Liste di cattura — weak/unowned e cattura dei valori» è 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 3 lezioni in totale.

Cosa imparerò in «Liste di cattura — weak/unowned e cattura dei valori»?

Utilizzi le liste di cattura per controllare il modo in cui le closure catturano riferimenti e valori: [weak self], unowned e snapshot dei valori per evitare cicli di mantenimento e bug difficili da… 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 2 di 3.

Quanto tempo richiede la lezione «Liste di cattura — weak/unowned e cattura dei valori»?

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

  1. Basi delle closure e del capture
  2. Liste di cattura — weak/unowned e cattura dei valori
  3. Escaping e non-escaping, autoclosure
← Torna a Swift Academy