Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

11. diel - Podmienky vo Swift druhýkrát - ternárne výraz a mocnejšie switch

V dnešnom Swift tutoriálu si predstavíme 2 ďalšie konštrukcie, ktoré súvisia s podmienkami. Ide o oddychovú lekciu, ktorú túto tému dokončíme.

Ternárne operátor

Často sa nám stáva, že niekde potrebujeme nastaviť 2 rôzne hodnoty podľa toho, či platia nejaké podmienka.

Príklad - Výpis pohlavia

Predstavme si, že máme napr. Pohlavia užívateľa uložené ako Bool (muž by bol true) a my by sme ho chceli previesť do textu. S doterajšími znalosťami by sme napísali asi takýto kód:

let muz = true // nejaká premenná udávajúci pohlavia
let nazevPohlavi: String
if muz {
    nazevPohlavi = "muž"
} else {
    nazevPohlavi = "žena"
}

print(nazevPohlavi)

Výstup programu je samozrejme nasledovné:

muž

Kód je pomerne ukecaný na to, že len prepína medzi dvoma hodnotami. Preto programovacie jazyky často podporujú tzv. Ternárne výraz.

Syntaxe ternárního výrazu

Pomocou tohto operátora môžeme získať hodnotu podľa platnosti logického výrazu. Zapíšeme ho takto:

výraz ? hodnota1 : hodnota2

Podmienku vložíme väčšinou do zátvorky (), ak je zložitejšia, potom nasleduje otáznik ? a dve hodnoty, ktoré sa majú vrátiť. Hodnoty sú oddelené dvojbodkou :, prvá sa vráti keď podmienka platí a druhá keď neplatí. Ako ľahké!:) Názov operátora je odvodený od toho, že má 3 časti (podmienka, prvá hodnota a druhá hodnota), preto ternárne.

Príklad - Použitie ternárního výrazu

Poďme si ternárne operátor vyskúšať na príklade s pohlavím:

let muz = true
let nazevPohlavi = muz ? "muž" : "žena"
print(nazevPohlavi)

Namiesto typu Bool by sme mohli samozrejme napísať akúkoľvek inú podmienku, napr. (vek >= 18) ? " plnoletý " : " maloletý ".

Vnorovanie ternárne operátorov

Ternárne operátormi možno teoreticky ponoriť do seba a tým reagovať aj na tri a viac hodnôt. Avšak vo väčšine prípadov ponáranie skôr kód znepřehlední, vznikajú totiž dlhé alebo podivne zalomené riadky a nie je na prvý pohľad vidieť, aká časť sa kedy spustí. Ukážme si, ako by sa pomocou vnorovanie ternárne výrazov vyriešil výpis troch pohlavia:

let pohlavi = "nevim"
let nazevPohlavi = pohlavi == "muz" ? "muž" : pohlavi == "zena" ? "žena" : "nezname"
print(nazevPohlavi)

Pre príklad vyššie by bolo lepšie vytvoriť vlastnú metódu, čo si ale ukážeme až v nadväzujúcom kurze objektovo orientovaného programovania.

Pokročilejšie switch

S konštrukciou switch sme sa už stretli v lekcii Podmienky (vetvenia). Dnes si ukážeme jej ďalší použitie, ktoré nie je tak časté, ale môžete na neho naraziť. Akonáhle switch vykoná prvé case, tak sa jeho vykonávanie ukončí. Môžeme ale použiť špeciálne kľúčové slovo fallthrough a toto správanie upraviť.

V jazykoch ako C dokonca switch automaticky "prepadáva", takže je nutné písať explicitne break do každej vetvy.

Príklad - Štvrťrok

Predpokladajme, že chceme podľa mesiaca v roku zistiť, aké je štvrťrok. Pomocou if a else by príklad vyzeral nasledovne:

let mesic = 2
if mesic >= 1 && mesic <= 3 {
    print("Je prvý štvrťrok")
} else if mesic >= 4 && mesic <= 6 {
    print("Je druhý štvrťrok")
} else if mesic >= 7 && mesic <= 9 {
    print("Je tretí štvrťrok")
} else if mesic >= 10 && mesic <= 12 {
    print("Je štvrtý štvrťrok")
}

Ako ale použiť switch pre takýto príklad? Možno by vás napadol nasledujúce zápis:

let mesic = 11
switch mesic {
case 1:
    print("Je prvý štvrťrok")
case 2:
    print("Je prvý štvrťrok")
case 3:
    print("Je prvý štvrťrok")
case 4:
    print("Je druhý štvrťrok")
case 5:
    print("Je druhý štvrťrok")
case 6:
    print("Je druhý štvrťrok")
case 7:
    print("Je tretí štvrťrok")
case 8:
    print("Je tretí štvrťrok")
case 9:
    print("Je tretí štvrťrok")
case 10:
    print("Je štvrtý štvrťrok")
case 11:
    print("Je štvrtý štvrťrok")
case 12:
    print("Je štvrtý štvrťrok")
default:
    break
}

Príklad funguje spoľahlivo, problém však je, že sme si týmto zápisom moc nepomohli. Podobnému repetitivnímu kódu by sme sa vždy mali vyhýbať.

Definícia viac hodnôt a rozsahu case

Jednotlivé case vo Swiftu môžu byť definované pre viac hodnôt. Napríklad case 1, 2, 3, ktorý sa vykoná, ak bude mať premenná jednu z týchto hodnôt.

Ešte lepšie je potom možnosť využiť typ Range a použiť tento zápis: case 1...3. Mohli by sme zapísať tiež ako case 1..<4.

Upravme náš príklad:

let mesic = 11
switch mesic {
case 1, 2, 3:
    print("Je prvý štvrťrok")
case 4...6:
    print("Je druhý štvrťrok")
case 7...9:
    print("Je tretí štvrťrok")
case 10...12:
    print("Je štvrtý štvrťrok")
default:
    break
}

Ukážka výstupu aplikácie:

Je štvrtý štvrťrok.

Tento zápis je už oveľa prehľadnejšie. A pre podobné prípady sa dosť dobre hodí.

Keby ste niečoho podobného chceli docieliť s if, tak je nutné použiť metódu contains() na inštanciu Range. Vyzeralo by to nejako takto:

if (1...3).contains(mesic) {
    print("Je první čtvrtletí")
}

Ako už sme si povedali, vo Swiftu nedochádza k automatickému prepadávaniu u case, takže do nich nemusíme písať break. Prepadnutie ale môžeme vynútiť pomocou kľúčového slova fallthrough. To spôsobí, že program "prepadne" na ďalší case, ktorý tiež vykoná, tu už je jedno, či je splnená podmienka. Zatiaľ som sa s fallthrough osobne nestretol, môžete sa hodiť napr., Keď by ste chceli vykonať default blok, prípade u pokročilejších konštrukcií, kde v rámci jedného case zachytávajú viac podmienok.

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


 

Predchádzajúci článok
Viacrozmerné polia vo Swift
Všetky články v sekcii
Základné konštrukcie jazyka Swift
Preskočiť článok
(neodporúčame)
Riešené úlohy k 10.-11. lekciu Swift
Č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