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.