Letní akce! Lákají tě IT školení C#, Javy a PHP v Brně? Přihlas se a napiš nám do zpráv kód "BRNO 500" pro slevu 500 Kč na libovolný brněnský kurz. Lze kombinovat se slevami uvedenými u školení i použít pro více kurzů. Akce končí 28.7.

Lekce 10 - Vícerozměrná pole ve Swift

Swift Základní konstrukce Vícerozměrná pole ve Swift

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Textové řetězce ve Swift do třetice - Split a joined, jsme si uvedli metody split() a joined() na textových řetězcích. Dnešní lekce je v kurzu základních konstrukcí Swift v podstatě bonusová a pojednává o tzv. vícerozměrných polích.

Již umíme pracovat s jednorozměrným polem, které si můžeme představit jako řádku přihrádek v paměti počítače.

Struktura pole

(Na obrázku je vidět pole osmi čísel)

Ačkoli to není tak časté, v programování se občas setkáváme i s vícerozměrnými poli a to zejména pokud programujeme nějakou simulaci (např. hru).

Dvourozměrné pole

Dvourozměrné pole si můžeme v paměti představit jako tabulku a mohli bychom takto reprezentovat např. rozehranou partii piškvorek. Pokud bychom se chtěli držet reálných aplikací, které budete později v zaměstnání tvořit, můžeme si představit, že do 2D pole budeme ukládat informace o obsazenostech sedadel v kinosálu. Situaci bychom si mohli graficky znázornit např. takto:

Struktura dvourozměrného pole

(Na obrázku je vidět 2d pole reprezentující obsazenost kinosálu)

Kinosál by byl v praxi samozřejmě větší, ale jako ukázka nám toto pole postačí. 0 znamená volno, 1 obsazeno. Později bychom mohli doplnit i 2 - rezervováno a podobně. Pro tyto stavy by bylo správnější vytvořit si vlastní datový typ, tzv. výčet, ale s ním se setkáme až později, takže si teď musíme vystačit pouze s čísly.

2D pole inicializujeme ve Swift následujícím způsobem:

var kinosal = [[Int]]()

Ve skutečnosti se jedná o pole polí. Takže jednotlivým prvkem tohoto pole je zase další pole.

Výše jsme sice dvourozměrné pole úspěšně deklarovali, ale jeho naplnění nulami, abychom mohli začít reprezentovat kinosál, by bylo zbytečně zdlouhavé. Proto si pole vytvoříme druhým způsobem:

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

Třída Array umožňuje snadno vytvořit pole s opakujícími se hodnotami. Mohli bychom toho samozřejmě využít i pro tradiční 1D pole. Parametr repeating určuje, co se bude opakovat a count kolikrát. Takže my pro první pole nastavíme, že se 5x bude opakovat další pole a pro tato vnitřní pole již nastavíme "0" jako hodnotu.

Naše 2D pole si můžeme pro kontrolu vypsat. První cyklus projede jednotlivá pole a ten vnořený potom jejich 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

Naplnění daty

Nyní kinosál naplníme jedničkami tak, jak je vidět na obrázku výše. Protože budeme jako správní programátoři líní, využijeme k vytvoření řádku jedniček for cykly :) Pro přístup k prvku 2D pole musíme samozřejmě zadat 2 souřadnice. Kdybychom pole neměli naplněné nulami (či jinými hodnotami), tak tento kód nebude fungovat.

kinosal[2][2] = 1 // Prostředek
for i in 1..<4 { // 4. řádek
        kinosal[3][i] = 1
}
for i in 0..<5 { // Poslední řádek
        kinosal[4][i] = 1
}

Pro kontrolu můžeme pole opět vypsat:

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-rozměrná pole

Někdy může být příhodné vytvořit si pole o ještě více dimenzích. My všichni si jistě dokážeme představit minimálně 3D pole. S příkladem s kinosálem se nabízí případ užití, kdy má budova více pater (nebo obecně více kinosálů). Vizualizace by vypadala asi nějak takto:

3D pole ve Swift

3D pole můžeme vytvořit tím samým způsobem, jako 2D pole:

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

Případně pomocí třídy Array:

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

Princip je stále stejný, akorát je těžší se v něm orientovat :-)

Kód výše vytvoří 3D pole jako na obrázku. Přistupovat k němu budeme opět přes indexer (hranaté závorky) jako předtím, jen již musíme zadat 3 souřadnice.

kinosaly[1][2][3] = 1 // Druhý kinosál, třetí řada, čtvrtý sloupec

Naše kino bychom si mohli vypsat třeba takto:

var patro = 1

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

Výstup po přiřazení 1 v kódu výše:

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ávěr bych rád dodal, že někteří lidé, kteří neumí správně používat objekty, využívají 2D polí k ukládání více údajů o jediné entitě. Např. budeme chtít uložit výšku, šířku a délku pěti mobilních telefonů. Ačkoli se vám nyní může zdát, že se jedná o úlohu na 3D pole, ve skutečnosti se jedná o úlohu na obyčejné 1D pole objektů typu Telefon. Ale o tom až u objektově orientovaného programování. Pole si určitě ještě vyzkoušejte ještě v cvičení v tomto kurzu.

V příští lekci, Matematické funkce ve Swift, se podíváme na matematické funkce a základní kurz Swiftu dokončíme.


 

Stáhnout

Staženo 1x (32.49 kB)
Aplikace je včetně zdrojových kódů v jazyce Swift

 

 

Článek pro vás napsal Filip Němeček
Avatar
Jak se ti líbí článek?
1 hlasů
Autor se příležitostně věnuje vývoji iOS aplikací či těch webových za pomocí frameworku Django. Aktuální projekt: hrejzdarma.cz Twitter: @nemecek_f (neprogramátorské tweety)
Aktivity (4)

 

 

Komentáře

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.

Zatím nikdo nevložil komentář - buď první!