Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

3. diel - Typový systém druhýkrát: Dátové typy vo Swift

V predchádzajúcom cvičení, Riešené úlohy k 1.-2. lekciu Swift, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.

V minulej lekcii Swift kurzu, Riešené úlohy k 1.-2. lekciu Swift , sme si ukázali základné dátové typy, boli to Int, String a Double. Teraz sa na dátové typy pozrieme viac zblízka a vysvetlíme si, kedy aký použiť. Dnešná lekcia bude veľa teoretická, ale o to viac bude praktická tá budúci. Na konci si vytvoríme pár jednoduchých ukážok.

Swift rozoznáva dva druhy dátových typov, hodnotové a referenčný. Tým referenčným sa budeme venovať neskôr.

Hodnotovej dátové typy

Premenné hodnotového dátového typu si dokážeme jednoducho predstaviť. Môže sa jednať napr. O číslo alebo znak. V pamäti je jednoducho uložená priamo hodnota a my k tejto hodnote môžeme z programu priamo pristupovať. Slovo priamo som toľkokrát nepoužil len náhodou. V tomto Swift kurze sa budeme venovať výhradne týmto premenným.

Celočíselné dátové typy

Pozrime sa teraz na tabuľku všetkých vstavaných celočíselných dátových typov vo Swift, všimnite si typu Int, ktorý už poznáme z minulosti.

dátový typ rozsah veľkosť
Int -2 147 483 648 až 2 147 483 647 32 bitov
UINT 0 až 4 294 967 295 32 bitov
Rozsahy týchto typov si samozrejme nemusíte pamätať, pre celé čísla môžete jednoducho používať vždy typ Int.

Viac informácií môžete nájsť v oficiálnej dokumentácii. Tú otvoríte skrze Help -> Developer Documentation. Potom už stačí len vyhľadávať. Ku konkrétnym dátovým typom apod. Sa môžete ľahko dostať skrze Quick Help inšpektor v pravej strane Xcode. Stačí mať označený napr. Int typ a v inšpektorovi kliknúť na Structure Referencie.

Prefix U u UInt znamená, že neumožňuje uložiť zápornú hodnotu a tým pádom môže uložiť dvojnásobnú kladnú. Týmto typom sa hovorí unsigned, klasickým signed.

Desatinné čísla

U desatinných čísel je situácia podobná, máme na výber dva dátové typy. Samozrejme sa líšia opäť v rozsahu hodnoty, ďalej však ešte v presnosti (vlastne počtu des. Miest). Typ Double má už podľa názvu dvojnásobnú presnosť oproti Float.

dátový typ rozsah presnosť
float + -1.5 * 10 -45 až + -3.4 * 10 38 7 čísel
double + -5.0 * 10 -324 až + -1.7 * 10 308 15-16 čísel
Vzhľadom k tomu, že desatinné čísla sú v počítači uložené v dvojkovej sústave, dochádza k určitej strate presnosti. Odchýlka je síce takmer zanedbateľná, však keď budete programovať napr. Finančný systém, nepoužívajte tieto dát. typy pre uchovanie peňazí, mohlo by dôjsť k malým odchýlkam.

Typ Double je pre desatinné čísla predvolené, Float je tak nutné bližšie špecifikovať.

let f : Float = 3.14
let d = 2.72

Ako desatinný separátor používame v zdrojovom kóde vždy bodku, nehľadiac na to, aké máme v MacOS regionálne nastavenie.

Ďalšie vstavané dátové typy

Pozrime sa na ďalšie dátové typy, ktoré nám Swift ponúka:

dátový typ rozsah Veľkosť / Presnosť
Character U + 0000 až U + ffff 16 bitov
decimal + -1.0 * 10 -28 až + -7.9 * 10 28 28-29 čísel
Bool true alebo false 8 bitov
Character

Character nám reprezentuje jeden znak, na rozdiel od String, ktorý reprezentoval celý reťazec hodnôt typu Character. Znaky v Swift píšeme do klasických úvodzoviek a dátový typ je nutné špecifikovať, inak bude použitý String:

let c : Character = "A"

Decimal

Typ Decimal rieši problém ukladania desatinných čísel v binárnej podobe, ukladá totiž číslo vnútorne podobne ako text. Používa sa teda pre uchovanie peňažných hodnôt. Ku všetkým ďalším matematickým operáciám s des. číslami použijeme Double alebo Float. K zápisu Decimal hodnoty opäť musíme dátový typ špecifikovať:

let number : Decimal = 3.14159265358979323846

Bool

Dátový typ Bool nadobúda dvoch hodnôt: true (pravda) a false (nepravda). Budeme ho používať najmä vtedy, až sa dostaneme k podmienkam. Do premennej typu Bool možno uložiť ako priamo hodnotu true / false, tak i logický výraz. Skúsme si jednoduchý príklad:

Klikni pre editáciu
  • let b = false
    let vyraz = 15 > 5
    print(b)
    print(vyraz)
    
    • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

    Výstup programu:

    false
    true

    Výrazy môžeme písať do zátvoriek. To sa hodí v prípade, že ich máme napr. Niekoľko. Vidíme, že výraz nadobúda hodnoty true (pravda), pretože 15 je naozaj väčší ako 5. Od výrazov je to len krok k podmienkam, na ne sa pozrieme nabudúce.

    String

    Dátový typ, s ktorým sa stretnete na každom kroku. Reprezentuje reťazec znakov, či proste akýkoľvek text. Jedná sa o hodnotový typ. My si ukážeme hlavne dôležité metódy, ktoré je dobré poznať alebo aspoň vedieť, že existujú. Metódy skúšajte v Command Line, nie v Playground.

    contains(), hasSuffix() a hasPreffix()

    Môžeme sa jednoducho opýtať, či reťazec začína, končí alebo či obsahuje určitý podreťazec (substring). Podreťazcom myslíme časť pôvodného reťazca. Všetky tieto metódy budú ako parameter brať samozrejme podreťazec a vracať hodnoty typu Bool (true / false). Zatiaľ na výstup nevieme reagovať, ale poďme si ho aspoň vypísať:

    Klikni pre editáciu
    • let s = "Krokonosohroch"
      print(s.hasPrefix("krok"))
      print(s.hasSuffix("hroch"))
      print(s.contains("nos"))
      print(s.contains("roh"))
      
      • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

      Výstup programu:

      false
      true
      true
      false

      Vidíme, že všetko funguje podľa očakávania. Prvý výraz samozrejme neprešiel vďaka tomu, že reťazec v skutočnosti začína veľkým písmenom.

      uppercased() a lowercased()

      Rozlišovanie veľkých a malých písmen môže byť niekedy na obtiaž. Veľakrát sa budeme potrebovať opýtať na prítomnosť podreťazca tak, aby nezáležalo na veľkosti písmen. Situáciu môžeme vyriešiť pomocou metód uppercased() a lowercased(), ktoré vracia reťazec vo veľkých a v malých písmenách. Uveďme si reálnejšie príklad ako je Krokonosohroch. Budeme mať v premennej riadok konfiguračného súboru, ktorý písal užívateľ. Keďže sa na vstupy od užívateľov nemožno spoľahnúť, musíme sa snažiť eliminovať možné chyby, tu napr. S veľkými písmenami.

      Klikni pre editáciu
      • var konfig = "Fullscreen shaDows autosave"
        konfig = konfig.lowercased()
        print("Pobeží hra vo fullscreen?")
        print(konfig.contains("fullscreen"))
        print("Budú zapnuté tiene?")
        print(konfig.contains("shadows"))
        print("Želá si hráč vypnúť zvuk?")
        print(konfig.contains("nosound"))
        print("Želá si hráč hru automaticky ukladať?")
        print(konfig.contains("autosave"))
        
        • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

        Výstup programu:

        Pobeží hra vo fullscreen?
        true
        Budú zapnuté tiene?
        true
        Želá si hráč vypnúť zvuk?
        false
        Želá si hráč hru automaticky ukladať?
        true

        Vidíme, že sme schopní zistiť prítomnosť jednotlivých slov v reťazci tak, že si najprv reťazec prevedieme celý na malé písmená (alebo na veľké) a potom kontrolujeme prítomnosť slová len malými (alebo veľkými) písmenami. Takto by mimochodom mohlo naozaj vyzerať jednoduché spracovanie nejakého konfiguračného skriptu.

        trimmingCharacters()

        Problémom vo vstupoch od užívateľa môže byť aj diakritika. Swift ale našťastie pracuje plne v Unicode, nestane sa nám teda, že by sa diakritika nejako skomolila. Ďalšou nástrahou môžu byť medzery a všeobecne všetky tzv. Biele znaky, ktoré nie sú vidieť, ale môžu nám uškodiť. Vo všeobecnosti môže byť dobré tzv. Trimovať všetky vstupy od užívateľa. Máme dostupnú metódu trimmingCharacters(in: ), pričom je ešte nutné zadať, čo budeme trimovať, pretože sa jedná o výpočet, tak napíšeme . a Xcode nám samo navrhne hromadu možností, čo trimmovat. Najčastejšie budete používať možnosť .whitespacesAndNewlines, čo odstráni všetky biele znaky a tiež odriadkovanie okolo reťazca.

        Klikni pre editáciu
        • print("Zadajte číslo:")
          let s = readLine()!
          print("Zadal ste text: " + s)
          print("Text po funkciu trim: " + s.trimmingCharacters(in: .whitespacesAndNewlines))
          let a = Int(s)!
          print("Previedol som zadaný text na číslo parsováním, zadal ste: \(a)")
          
          • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

          replacingOccurrences()

          Asi najdôležitejšie metódou na String je nahradenie určitej jeho časti iným textom. Ako parametre zadáme dva podreťazca, jeden čo chceme nahrádzať a druhý ten, ktorým to chceme nahradiť. Metóda vráti nový String, v ktorom prebehlo nahradenie. Keď daný podreťazec metóda nenájde, vráti pôvodnú reťazec. Skúsme si to:

          Klikni pre editáciu
          • let s = "Java je najlepší!"
            let replaced = s.replacingOccurrences(of: "Java", with: "Swift")
            print(replaced)
            
            • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

            Výstup programu:

            Swift je najlepší!

            Iterpolace reťazcov

            Interpoláciu reťazcov sme si už spomínali. Vo Swift argumenty či jednoducho premenné, ktoré chceme do reťazca na určité miesta vložiť, zapíšeme priamo do stringu pomocou \():

            Klikni pre editáciu
            • let a = 10
              let b = 20
              let c = a + b
              let s = "Keď sčítame \(a) a \(b), dostaneme \(c)"
              print(s)
              
              • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

              Výstup programu:

              Keď sčítame 10 a 20, dostaneme 30

              Funkcia print() sama vie prijímať text v takomto formáte, môžeme teda napísať:

              let a = 10
              let b = 20
              let c = a + b
              print("Keď sčítame \(a) a \(b), dostaneme \(c)")

              Toto je veľmi užitočná a prehľadná cesta, ako zostavovať reťazca. Ak chceme vypísať čísla, tak sa ju nevyhnete. U viac STRING môžete použiť konkatenaci (jednoducho + pre ich "sčítaní").

              Vlastnosť count

              Posledný, ale najdôležitejšie vlastnosť (pozor, nie metóda) je count, teda počet znakov. Vracia celé číslo, ktoré predstavuje počet znakov v reťazci. Za vlastnosti nepíšeme zátvorky, pretože nemajú parametre. Slovo "length" by dávalo intuitívne väčší zmysel, ale Swift vlastnosť berie ako spomínaný počet znakov, takže si holt musíme zvyknúť na count.

              Klikni pre editáciu
              • print("Zadajte vaše meno:")
                let jmeno = readLine()!
                print("Dĺžka vášho mena je: \(jmeno.count)")
                
                • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                Padding

                Padding znamená, že STRING pridáme znaky, aby sme ho dostali na požadovanú dĺžku. Často sa používa pre pridanie medzier, ale môžete doplniť akýkoľvek znak. Niektoré jazyky ponúka pohodlné metódy pre padding zľava alebo sprava. Swift má iba jednu a chce po nás celkom dosť parametrov. Podrobne si ju popíšeme ďalej v kurze.

                Ak vám nejaké metódy z tejto lekcie nefungujú, uistite sa, že máte v súbore import Foundation pre importovanie základné Swift funkcionality.

                Je toho ešte veľa k vysvetľovaniu a sú ďalšie dátové typy, ktoré sme neprebrali. Aby sme však stále nepreberala len teóriu, ukážeme si už v nasledujúcej lekcii, Riešené úlohy k 3. lekcii Swift , podmienky a neskôr cykly, potom bude naša programátorská výbava dostatočne veľká na to, aby sme tvorili zaujímavé programy :)

                V nasledujúcom cvičení, Riešené úlohy k 3. lekcii Swift, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.


                 

                Ako sa ti páči článok?
                Pred uložením hodnotenia, popíš prosím autorovi, čo je zleZnakov 0 z 50-500
                Predchádzajúci článok
                Riešené úlohy k 1.-2. lekciu Swift
                Všetky články v sekcii
                Základné konštrukcie jazyka Swift
                Preskočiť článok
                (neodporúčame)
                Riešené úlohy k 3. lekcii Swift
                Článok pre vás napísal Filip Němeček
                Avatar
                Užívateľské hodnotenie:
                1 hlasov
                Autor se věnuje vývoji iOS aplikací (občas macOS)
                Aktivity