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í.

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

V předešlém cvičení, Řešené úlohy k 10. lekci Swift, jsme si procvičili nabyté zkušenosti z předchozích lekcí.

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 - Základní konstrukce jazyka Swift

(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 - Základní konstrukce jazyka Swift

(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 - Základní konstrukce jazyka 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, Podmínky ve Swift podruhé - Ternární výraz a mocnější switch, si představíme dvě další konstrukce, které souvisejí s podmínkami.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

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

 

Předchozí článek
Řešené úlohy k 10. lekci Swift
Všechny články v sekci
Základní konstrukce jazyka Swift
Přeskočit článek
(nedoporučujeme)
Podmínky ve Swift podruhé - Ternární výraz a mocnější switch
Článek pro vás napsal Filip Němeček
Avatar
Uživatelské hodnocení:
6 hlasů
Autor se věnuje vývoji iOS aplikací (občas macOS)
Aktivity