IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 14 - Ošetřování chyb ve Swift

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
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 ;)

 
Odpovědět
12.9.2018 15:08
Avatar
Filip Němeček
Tvůrce
Avatar
Odpovídá 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..)

 
Odpovědět
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 :)

 
Odpovědět
12.9.2018 16:50
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.