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:
{SWIFT}
let muz = true // nejaká premenná udávajúci pohlavia
let nazevPohlavi: String
if muz {
nazevPohlavi = "muž"
} else {
nazevPohlavi = "žena"
}
print(nazevPohlavi)
{/SWIFT}
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:
{SWIFT}
let muz = true
let nazevPohlavi = muz ? "muž" : "žena"
print(nazevPohlavi)
{/SWIFT}
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:
{SWIFT}
let pohlavi = "nevim"
let nazevPohlavi = pohlavi == "muz" ? "muž" : pohlavi == "zena" ? "žena" : "nezname"
print(nazevPohlavi)
{/SWIFT}
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:
{SWIFT}
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")
}
{/SWIFT}
Ako ale použiť switch
pre takýto príklad? Možno by vás
napadol nasledujúce zápis:
{SWIFT}
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
}
{/SWIFT}
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:
{SWIFT}
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
}
{/SWIFT}
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í.