Sobes.tech
Junior — Middle

Czy konieczne jest użycie mechanizmu ucieczki dla zamknięć przekazywanych jako argumenty funkcji?

sobes.tech AI

Odpowiedź od AI

W Swift domyślnie zamknięcia są non-escaping, czyli nie mogą być przechowywane ani wywoływane po zakończeniu funkcji, do której są przekazywane.

Jeśli konieczne jest zapisanie i wywołanie zamknięcia później (np. w wywołaniu asynchronicznym, callbacku), należy je oznaczyć jako @escaping.

Przykład:

func performAsyncTask(completion: @escaping () -> Void) {
    DispatchQueue.global().async {
        // jakaś praca
        completion() // wywołanie zamknięcia później
    }
}

Jeśli zamknięcie jest używane tylko wewnątrz funkcji i nie jest przechowywane, @escaping nie jest potrzebne.

W związku z tym, mechanizm escaping powinien być używany tylko wtedy, gdy zamknięcie może być wywołane po opuszczeniu funkcji, do której zostało przekazane.