Sobes.tech
Junior — Middle

Proč je důležité výslovně uvádět anotaci @escaping ve funkcích, které používají asynchronní uzávěry?

sobes.tech AI

Odpověď od AI

V Swiftu označení @escaping znamená, že uzávěr (closure) může být volán po ukončení funkce, která ho přijala. To je důležité pro asynchronní operace, kde je uzávěr uložen a volán později, například po dokončení síťového požadavku.

Bez @escaping předpokládá překladač, že uzávěr je volán synchronně uvnitř funkce, a neumožňuje jej uložit pro pozdější volání, aby se předešlo potenciálním problémům s řízením paměti a životním cyklem.

Příklad:

func fetchData(completion: @escaping () -> Void) {
    DispatchQueue.global().async {
        // Asynchronní práce
        completion() // volání uzávěru později
    }
}

Zde je completion označen jako @escaping, protože je volán po opuštění funkce fetchData, na jiném vlákně.

Pokud @escaping není v takových případech uveden, kompilátor vypíše chybu, protože uzávěr může být volán později, a bez této anotace Swift nezaručuje správné řízení paměti a životního cyklu uzávěru.