Sobes.tech
Junior — Middle

Zašto je važno eksplicitno navesti anotaciju @escaping u funkcijama koje koriste asinhrone zatvaranja?

sobes.tech АИ

Одговор од АИ

U Swift-u, oznaka @escaping ukazuje da se zatvaranje (closure) može pozvati nakon što funkcija koja ga prima završi svoje izvršavanje. Ovo je važno za asinhrone operacije, gde se zatvaranje čuva i poziva kasnije, na primer, nakon završetka mrežnog zahteva.

Bez @escaping, kompajler pretpostavlja da se zatvaranje poziva sinhrono unutar funkcije i ne dozvoljava njegovo čuvanje za kasnije pozivanje, kako bi se izbegli potencijalni problemi sa upravljanjem memorijom i životnim ciklusom.

Primer:

func fetchData(completion: @escaping () -> Void) {
    DispatchQueue.global().async {
        // Asinhroni rad
        completion() // pozivanje kasnije
    }
}

Ovde je completion označeno kao @escaping jer se poziva nakon izlaska iz funkcije fetchData, na drugom thread-u.

Ako se ne navede @escaping u ovakvim slučajevima, kompajler će generisati grešku, jer se zatvaranje može pozvati kasnije, a bez ove anotacije Swift ne garantuje ispravno upravljanje memorijom i životnim ciklusom zatvaranja.