Middle
Spiega la differenza tra closures escaping e non-escaping e in quali casi è necessario usare @escaping.
sobes.tech AI
Risposta dell'AI
Le chiusure di default sono non escaping.
Chiusura non escaping:
- Viene eseguita nel corpo della funzione a cui viene passata.
- Cattura variabili, ma le rilascia dopo che la funzione termina.
- Non sopravvive alla funzione.
func doSomething(completion: () -> Void) {
// Chiamata di completion qui
completion()
}
Chiusura escapable:
- Viene eseguita dopo che la funzione a cui viene passata ritorna.
- Sopravvive al corpo della funzione.
- Può essere memorizzata per l'esecuzione successiva, ad esempio in un altro thread o in modo asincrono.
- Cattura variabili, mantenendo riferimenti forti, il che può portare a cicli di riferimenti forti (retention cycles). Richiede la dichiarazione esplicita
@escaping.
class DataManager {
var completionHandlers: [() -> Void] = []
func addCompletionHandler(handler: @escaping () -> Void) {
completionHandlers.append(handler)
}
func performTasks() {
// Esecuzione di compiti...
for handler in completionHandlers {
handler() // Chiamata degli handler più tardi
}
}
}
L'uso di @escaping è necessario nei seguenti casi:
- Quando la chiusura viene memorizzata come proprietà di una classe o struttura.
- Quando la chiusura viene passata a un altro thread o operazione asincrona (ad esempio, richiesta di rete, GCD, OperationQueue).
- Quando la chiusura viene usata come gestore di eventi o delegato.