Swift Academy · Lezione

Liste di cattura delle closure e [weak self]

Utilizzare le liste di cattura per impedire alle closure di mantenere riferimenti forti agli oggetti.

Lezione 4 di 412 passaggi

Liste di cattura delle closure e [weak self] è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 4 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.

Benvenuto

Le closure catturano le variabili dall'ambito circostante. Le liste di cattura (`[weak self]`, `[unowned self]`, `[value]`) controllano esattamente il modo in cui queste catture vengono effettuate.

Cattura strong predefinita

```swift var name = "Alice" let greet = { print("Hello, \(name)") } name = "Bob" greet() // "Hello, Bob" — closure sees current value ``` Per impostazione predefinita, le closure catturano *riferimenti* alle variabili.

Nozioni di base sulle liste di cattura

```swift var count = 10 let snapshot = { [count] in print(count) } // captures value count = 99 snapshot() // 10 — snapshot of count at capture time ``` Inserire un tipo valore in `[]` ne copia il valore nel momento in cui viene creata la closure.

Pattern [weak self]

```swift class API { func fetch(completion: @escaping () -> Void) { ... } } class VC { func load() { api.fetch { [weak self] in guard let self else { return } // self might be nil by now self.updateUI() } } } ```

guard let self con estensione della durata di vita

Swift 5.3+: è possibile riassegnare `self` all'interno del guard senza usare un nome diverso: ```swift { [weak self] in guard let self else { return } // 'self' is now strong within this block doA() doB() doC() } ```

Quando [unowned self] è sicuro

```swift button.addTarget(self, action: #selector(tap), for: .touchUpInside) // If the button's closure is guaranteed not to outlive self: let action: () -> Void = { [unowned self] in self.handleTap() } ```

Cattura di più valori

```swift let base = 100 let multiplier = 2 let compute = { [base, multiplier] in base * multiplier } print(compute()) // 200 ``` Catturi più valori nella stessa lista, separandoli con virgole.

Lista di cattura con associazioni denominate

```swift let myService = service // rename in capture list: let handler = { [service = myService] in service.process() } ``` Utile per catturare uno snapshot specifico con un nuovo nome.

Escaping e non-escaping

• Una closure `@escaping` può essere memorizzata e chiamata dopo il ritorno della funzione → rischio di cicli • Una closure non-escaping viene chiamata prima del ritorno della funzione → nessun rischio di cicli ```swift func apply(_ f: () -> Void) { f() } // non-escaping, no [weak] needed func later(_ f: @escaping () -> Void) { queue.async { f() } } // escaping ```

Debug dei problemi di cattura

Se sospetta un ciclo: 1. Aggiunga `deinit { print("deallocated") }` alla classe 2. Torni alla schermata precedente o imposti l'istanza su nil 3. Se deinit non stampa nulla → esiste un ciclo Aggiunga quindi `[weak self]` alle closure di quella classe.

Verifica rapida

Che cosa fa `[weak self]` in una lista di cattura?

Riepilogo

Punti chiave: • Le closure catturano i riferimenti per impostazione predefinita • La lista di cattura `[value]` copia i tipi valore al momento della creazione • `[weak self]`: nessun retain, diventa automaticamente nil; usi `guard let self` • `[unowned self]`: nessun retain, non è sicuro rispetto a nil • Le closure `@escaping` richiedono liste di cattura; quelle non-escaping in genere no Corso completato! Successivo: programmazione funzionale in Swift.
Gratis per iniziare

Impara Swift con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
122
Lezioni
409

Domande Frequenti

La lezione «Liste di cattura delle closure e [weak self]» è gratuita?

Sì — il testo completo di «Liste di cattura delle closure e [weak self]» è 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 «Liste di cattura delle closure e [weak self]»?

Utilizzare le liste di cattura per impedire alle closure di mantenere riferimenti forti agli oggetti. 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 4 di 4.

Quanto tempo richiede la lezione «Liste di cattura delle closure e [weak self]»?

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. Come ARC conta i riferimenti
  2. Cicli di retain: cause e rilevamento
  3. Riferimenti weak e unowned
  4. Liste di cattura delle closure e [weak self]
← Torna a Swift Academy