Escaping e non-escaping, autoclosure
Comprenda le closure non-escaping (predefinite) rispetto a @escaping (memorizzate o utilizzate dopo la restituzione) e utilizzi @autoclosure per semplificare le chiamate con valutazione lazy.
Escaping e non-escaping, autoclosure è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 3 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.
Panoramica
Obiettivo: sapere quando una closure è non-escaping (il comportamento predefinito) rispetto a quando è @escaping (memorizzata o asincrona), e come @autoclosure renda più chiare le chiamate.
Comportamento non-escaping predefinito
I parametri closure sono non-escaping per impostazione predefinita: vengono invocati prima che la funzione restituisca il controllo e non vengono mai memorizzati.
// Non-escaping by default: used immediately inside the function.
func applyTwice(_ f: (Int) -> Int, to x: Int) -> Int {
return f(f(x)) // called synchronously; not stored
}
let doubled = applyTwice({ $0 * 2 }, to: 3)
print(doubled) // 12Closure escaping
Contrassegni il parametro con @escaping se memorizza la closure o la esegue dopo il ritorno della funzione, ad esempio per timer o operazioni asincrone.
// Need @escaping when storing for later use:
var tasks: [() -> Void] = []
func addTask(_ work: @escaping () -> Void) {
tasks.append(work) // stored to run later
}
addTask { print("run later") }
tasks.forEach { $0() }Completamento asincrono
Le API asincrone accettano in genere gestori di completamento @escaping, chiamati dopo il ritorno della funzione.
func fetchData(completion: @escaping (String) -> Void) {
// simulate async: call completion in the future
// (In real apps, use DispatchQueue or URLSession)
completion("done") // still escaping by contract (may be called later)
}
fetchData { result in print(result) }Autoclosure
@autoclosure consente ai chiamanti di passare un'espressione invece di scrivere una closure, migliorando la leggibilità.
// @autoclosure converts an expression into () -> Bool automatically.
func logIf(_ condition: @autoclosure () -> Bool) {
if condition() { print("Condition is true") }
}
let x = 3
logIf(x > 1) // no braces needed; expression is turned into a closureAutoclosure + escaping
@autoclosure @escaping memorizza l'espressione passata per valutarla in seguito: presti attenzione allo stato catturato e ai tempi di valutazione.
// You can combine @autoclosure with @escaping:
// (be careful: the expression is captured and evaluated later)
var checks: [() -> Bool] = []
func enqueueCheck(_ condition: @autoclosure @escaping () -> Bool) {
checks.append(condition) // stored to run later
}
var threshold = 10
enqueueCheck(threshold > 5) // captures current variable by reference semantics
threshold = 3
print(checks.map { $0() }) // re-evaluates with updated thresholdRegola di escaping
Verifica rapida: quando è richiesto @escaping?
Riepilogo
Riepilogo: le closure sono non-escaping per impostazione predefinita. Usi @escaping se vengono memorizzate o chiamate in seguito. Usi @autoclosure per rendere più chiare le chiamate e lo combini con @escaping con cautela.
Domande Frequenti
La lezione «Escaping e non-escaping, autoclosure» è gratuita?
Sì — il testo completo di «Escaping e non-escaping, autoclosure» è 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 «Escaping e non-escaping, autoclosure»?
Comprenda le closure non-escaping (predefinite) rispetto a @escaping (memorizzate o utilizzate dopo la restituzione) e utilizzi @autoclosure per semplificare le chiamate con valutazione lazy. 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 3 di 3.
Quanto tempo richiede la lezione «Escaping e non-escaping, autoclosure»?
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
- Basi delle closure e del capture
- Liste di cattura — weak/unowned e cattura dei valori
- Escaping e non-escaping, autoclosure