Sobes.tech
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.