Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

Diskusia – 14. diel - Ošetrovanie chýb vo Swift

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
Tomáš "chlastyml" Kacálek:12.9.2018 15:08

Ahoj, takze pokud to chapu dobre, tak kod s defer:

func zapisDoSouboru(text: String) {
        let dokumentyUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as NSURL
        let souborUrl = dokumentyUrl.appendingPathComponent("info.txt")!

        do
        {
                try text.write(to: souborUrl, atomically: true, encoding: String.Encoding.unicode)
        }
        catch {
                print("Do soubor se nepovedlo zapsat, protože: \(error)")
        }

        defer {
                print("Provedena metoda zapisDoSouboru()")
        }
}

je uplne stejny jako bez neho:

func zapisDoSouboru(text: String) {
        let dokumentyUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as NSURL
        let souborUrl = dokumentyUrl.appendingPathComponent("info.txt")!

        do
        {
                try text.write(to: souborUrl, atomically: true, encoding: String.Encoding.unicode)
        }
        catch {
                print("Do soubor se nepovedlo zapsat, protože: \(error)")
        }

        print("Provedena metoda zapisDoSouboru()")
}

Pokud to stejne je, tak proc vubec pouzivat defer? (jako skutecnost ze ho muzu napsat kdekoliv v kodu, mi prijde dost kontraproduktivni, kdyz se vykona na konci)
A pokud to steje neni tak proc?

Diky za odpovedi ;)

 
Odpovedať
12.9.2018 15:08
Avatar
Filip Němeček
Tvůrce
Avatar
Odpovedá na Tomáš "chlastyml" Kacálek
Filip Němeček:12.9.2018 16:25

Ahoj,

defer je poměrně specifické a máš pravdu, že v tomto případě na něm nezáleží. V try bloku bychom ale mohli něco klidně vracet a potom, by se print bez defer nevykonal. Defer je obecně takový "úklidový", když potřebuješ zavřít soubor, stream apod. Máš prostě jistotu, že se tyto akce vykonají a nemusel bys je volat vícekrát (když máš v metodě několikrát return, catch logiku..)

 
Odpovedať
12.9.2018 16:25
Avatar
Tomáš "chlastyml" Kacálek:12.9.2018 16:50

Diky za odpoved :)

Asi bude nejlepsi, kdyz se bude definovat za vytvoreni instance, na ktere se bude "uklidova" prace vykonavat.
Kdyby to bylo pred ni, tak se k ni v defer bloku nedostanes.
Navic po nahlednuti do kodu, clovek hned uvidi ze se uklid provadi ;)

V tomto ohledu je dobre dodat ze defer bloku je mozno mit v kodu vice. Podle zkouseni jsem vypozoroval, ze se vyhodnocuji odzdola nahoru, ale zcela prakticky by defer bloky na sebe nemely mit zadnou zavislost, takze je to vlastne jedno :)

 
Odpovedať
12.9.2018 16:50
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!