Sobes.tech
Junior — Middle

Prečo je dôležité výslovne uviesť anotáciu @escaping vo funkciách, ktoré používajú asynchrónne uzávery?

sobes.tech AI

Odpoveď od AI

V Swift, anotácia @escaping naznačuje, že uzáver (closure) môže byť volaný po tom, čo funkcia, ktorá ho prijala, ukončí svoje vykonávanie. To je dôležité pre asynchrónne operácie, kde sa uzáver uloží a zavolá neskôr, napríklad po dokončení sieťovej požiadavky.

Bez @escaping predpokladá prekladač, že uzáver je volaný synchronne vnútri funkcie, a neumožňuje ho uložiť na neskoršie volanie, aby sa predišlo potenciálnym problémom s riadením pamäte a životným cyklom.

Príklad:

func fetchData(completion: @escaping () -> Void) {
    DispatchQueue.global().async {
        // Asynchrónna práca
        completion() // volanie neskôr
    }
}

Tu je completion označené ako @escaping, pretože je volané po opustení funkcie fetchData, na inom vlákne.

Ak sa @escaping v takýchto prípadoch neuvádza, prekladač vygeneruje chybu, pretože uzáver môže byť volaný neskôr, a bez tejto anotácie Swift nezaručuje správne riadenie pamäte a životného cyklu uzáveru.