IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

10. diel - Viacrozmerné polia vo Swift

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

V minulej lekcii, Riešené úlohy k 9. lekcii Swift , sme si uviedli metódy split() a joined() na textových reťazcoch. Dnešná lekcia je v kurze základných konštrukcií Swift v podstate bonusová a pojednáva o tzv. Viacrozmerných poliach.

Už vieme pracovať s jednorozmernými poľom, ktoré si môžeme predstaviť ako riadku priehradok v pamäti počítača.

štruktúra poľa - Základné konštrukcie jazyka Swift

(Na obrázku je vidieť pole ôsmich čísiel)

Hoci to nie je tak časté, v programovaní sa občas stretávame aj s viacrozmernými poliami a to najmä ak programujeme nejakú simuláciu (napr. Hru).

Dvojrozmerné pole

Dvojrozmerné pole si môžeme v pamäti predstaviť ako tabuľku a mohli by sme takto reprezentovať napr. Rozohranú partiu piškvoriek. Ak by sme sa chceli držať reálnych aplikácií, ktoré budete neskôr v zamestnaní tvoriť, môžeme si predstaviť, že do 2D poľa budeme ukladať informácie o obsadenosť sedadiel v kinosály. Situáciu by sme si mohli graficky znázorniť napr. Nasledovne:

Štruktúra dvojrozmerného poľa - Základné konštrukcie jazyka Swift

(Na obrázku je vidieť 2d pole reprezentujúci obsadenosť kinosály)

Kinosála by bol v praxi samozrejme väčší, ale ako ukážka nám toto pole postačí. 0 znamená voľno, 1 obsadené. Neskôr by sme mohli doplniť aj 2 - Rezervované a podobne. Pre tieto stavy by bolo správnejšie vytvoriť si vlastný dátový typ, tzv. Výpočet, ale s ním sa stretneme až neskôr, takže si teraz musíme vystačiť iba s číslami.

2D polia inicializujeme vo Swift nasledujúcim spôsobom:

var kinosal = [[Int]]()

V skutočnosti sa jedná o pole polí. Takže jednotlivým prvkom tohto poľa je zase ďalšie pole.

Vyššie sme síce dvojrozmerné pole úspešne deklarovali, ale jeho naplnenie nulami, aby sme mohli začať reprezentovať kinosála, by bolo zbytočne zdĺhavé. Preto si pole vytvoríme druhým spôsobom:

var kinosal = Array(repeating: Array(repeating: 0, count: 5), count: 5)

Trieda Array umožňuje ľahko vytvoriť pole s opakujúcimi sa hodnotami. Mohli by sme toho samozrejme využiť aj pre tradičné 1D poľa. Parameter repeating určuje, čo sa bude opakovať a count koľkokrát. Takže my pre prvé pole nastavíme, že sa 5x bude opakovať ďalšie pole a pre tieto vnútorné polia už nastavíme 0 ako hodnotu.

Naše 2D poľa si môžeme pre kontrolu vypísať. Prvý cyklus prejde jednotlivé polia a ten vnorený potom ich hodnoty:

for pole in kinosal {
    for hodnota in pole {
        print(hodnota, terminator: " ")
    }
    print(" ")
}

výstup:

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

Naplnenie dátami

Teraz kinosála naplníme jednotkami tak, ako je vidieť na obrázku vyššie. Pretože budeme ako správni programátori leniví, využijeme na vytvorenie riadku jednotiek for cykly :) Pre prístup k prvku 2D poľa musíme samozrejme zadať 2 súradnice. Keby sme pole nemali naplnené nulami (či inými hodnotami), tak tento kód nebude fungovať.

kinosal[2][2] = 1 // Prostriedok
for i in 1..<4 { // 4. riadok
    kinosal[3][i] = 1
}
for i in 0..<5 { // Posledný riadok
    kinosal[4][i] = 1
}

Pre kontrolu môžeme poľa opäť vypísať:

0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 1 1 1 0
1 1 1 1 1

N-rozmerná pole

Niekedy môže byť príhodné vytvoriť si pole o ešte viac dimenziách. My všetci si iste dokážeme predstaviť minimálne 3D poľa. S príkladom s kinosálou sa ponúka prípad použitia, kedy má budova viac poschodí (alebo všeobecne viac kinosál). Vizualizácia by vyzerala asi nejako takto:

3D poľa vo Swift - Základné konštrukcie jazyka Swift

3D poľa môžeme vytvoriť tým istým spôsobom, ako 2D pole:

var kinosaly = [[[Int]]]()

Prípadne pomocou triedy Array:

var kinosaly = Array(repeating: Array(repeating: Array(repeating: 0, count: 5), count: 5), count: 3)

Princíp je stále rovnaký, akurát je ťažšie sa v ňom orientovať :-)

Kód vyššie vytvorí 3D poľa ako na obrázku. Pristupovať k nemu budeme opäť cez Indexer (hranaté zátvorky) ako predtým, len už musíme zadať 3 súradnice.

kinosaly[1][2][3] = 1 // Druhý kinosála, tretí rad, štvrtý stĺpec

Naše kino by sme si mohli vypísať napríklad takto:

var patro = 1

for kinosal in kinosaly {
    print("Poschodie: \(patro)")
    patro += 1
    for pole in kinosal {
        for hodnota in pole {
            print(hodnota, terminator: " ")
        }
        print(" ")
    }
    print("-----------------")
}

Výstup po priradení 1 v kóde vyššie:

Patro: 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
-----------------
Patro: 2
0 0 0 0 0
0 0 0 0 0
0 0 0 1 0
0 0 0 0 0
0 0 0 0 0
-----------------
Patro: 3
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
-----------------

Na záver by som rád dodal, že niektorí ľudia, ktorí nevie správne používať objekty, využívajú 2D polí na ukladanie viac údajov o jedinej entite. Napr. budeme chcieť uložiť výšku, šírku a dĺžku piatich mobilných telefónov. Hoci sa vám teraz môže zdať, že sa jedná o úlohu na 3D pole, v skutočnosti sa jedná o úlohu na obyčajné 1D pole objektov typu Telefon. Ale o tom až u objektovo orientovaného programovania. Pole si určite ešte vyskúšajte ešte v cvičenie v tomto kurze.

V budúcej lekcii, Podmienky vo Swift druhýkrát - ternárne výraz a mocnejšie switch , sa pozrieme na matematické funkcie a základný kurz Swiftu dokončíme.

V budúcej lekcii, Podmienky vo Swift druhýkrát - ternárne výraz a mocnejšie switch , si predstavíme dve ďalšie konštrukcie, ktoré súvisia s podmienkami.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 21x (32.49 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Swift

 

Predchádzajúci článok
Riešené úlohy k 9. lekcii Swift
Všetky články v sekcii
Základné konštrukcie jazyka Swift
Preskočiť článok
(neodporúčame)
Podmienky vo Swift druhýkrát - ternárne výraz a mocnejšie switch
Článok pre vás napísal Filip Němeček
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje vývoji iOS aplikací (občas macOS)
Aktivity