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 4 - Podmínky (větvení) ve Swift

Swift Základní konstrukce Podmínky (větvení) ve Swift

ONEbit hosting Unicorn College 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 Swift kurzu, Typový systém podruhé: Datové typy ve Swift, jsme si podrobně probrali datové typy. Abychom si něco naprogramovali, potřebujeme nějak reagovat na různé situace. Může to být například hodnota zadaná uživatelem, podle které budeme chtít měnit další běh programu. Říkáme, že se program větví a k větvení používáme podmínky. Těm se budeme věnovat celý dnešní Swift tutoriál. Vytvoříme program na výpočet odmocniny a vylepšíme naši kalkulačku.

Podmínky

Ve Swiftu se podmínky píší dost stejně, jako ve všech CLike jazycích, pro začátečníky samozřejmě vysvětlím. Pokročilejší se asi budou chvilku nudit :)

Podmínky zapisujeme pomocí klíčového slova if, za kterým následuje logický výraz. Pokud je výraz pravdivý, provede se následující příkaz. Pokud ne, následující příkaz se přeskočí a pokračuje se až pod ním. Vyzkoušejme si to:

if 15 > 5 {
        print("Pravda")
}
print("Program zde pokračuje dál")

Výstup programu:

Pravda
Program zde pokračuje dál

Pokud podmínka platí (což zde ano), provede se příkaz vypisující do konzole text pravda. V obou případech program pokračuje dál. Ve Swiftu není možné mít if bez složených závorek. Součástí výrazu samozřejmě může být i proměnná:

print("Zadej nějaké číslo")
var a = Int(readLine()!)!
if (a > 5) {
        print("Zadal jsi číslo větší než 5!")
}
print("Děkuji za zadání")

Ukažme si nyní relační operátory, které můžeme ve výrazech používat:

Operátor C-like Zápis
Rovnost ==
Je ostře větší >
Je ostře menší <
Je větší nebo rovno >=
Je menší nebo rovno <=
Nerovnost !=
Obecná negace !

Rovnost zapisujeme dvěma == proto, aby se to nepletlo s běžným přiřazením do proměnné, které se dělá jen jedním =. Pokud chceme nějaký výraz znegovat, napíšeme ho do závorky a před něj vykřičník. V podmínkovém bloku samozřejmě můžeme vykonat libovolně příkazů:

print("Zadej nějaké číslo, ze kterého spočítám odmocninu:")
let a = Int(readLine()!)!
if a > 0 {
        print("Zadal jsi číslo větší než 0, to znamená, že ho mohu odmocnit!")
        let o = sqrt(Double(a))
        print("Odmocnina z čísla \(a) je \(o)")
}
print("Děkuji za zadání")

Zadej nějaké číslo, ze kterého spočítám odmocninu:
144
Zadal jsi číslo větší než 0, to znamená, že ho mohu odmocnit!
Odmocnina z čísla 144 je 12
Děkuji za zadání

Program načte od uživatele číslo a pokud je větší než 0, vypočítá z něj druhou odmocninu. sqrt() vrací druhou odmocninu jako Double, ale musíme nejdřív vstup konvertovat na Double. Bylo by hezké, kdyby nám program vyhuboval v případě, že zadáme záporné číslo. S dosavadními znalostmi bychom napsali něco jako:

print("Zadej nějaké číslo, ze kterého spočítám odmocninu:")
let a = Int(readLine()!)!
if a > 0 {
        print("Zadal jsi číslo větší než 0, to znamená, že ho mohu odmocnit!")
        let o = sqrt(Double(a))
        print("Odmocnina z čísla \(a) je \(o)")
}
if a <= 0 {
        print("Odmocnina ze záporného čísla neexistuje!")
}

print("Děkuji za zadání")

Všimněte si, že musíme pokrýt i případ, kdy se a == 0, nejen když je menší. Kód však můžeme výrazně zjednodušit pomocí klíčového slova else, které vykoná následující příkaz nebo blok příkazů v případě, že se podmínka neprovede:

print("Zadej nějaké číslo, ze kterého spočítám odmocninu:")
let a = Int(readLine()!)!
if (a > 0) {
        print("Zadal jsi číslo větší než 0, to znamená, že ho mohu odmocnit!")
        let o = sqrt(Double(a))
        print("Odmocnina z čísla \(a) je \(o)")
}
else {
        print("Odmocnina ze záporného čísla neexistuje!")
}

print("Děkuji za zadání")

Kód je mnohem přehlednější a nemusíme vymýšlet opačnou podmínku, což by v případě složené podmínky mohlo být někdy i velmi obtížné. V případě více příkazů by byl za else opět blok { }.

Klíčové slovo else se také využívá v případě, kdy potřebujeme v příkazu manipulovat s proměnnou z podmínky a nemůžeme se na ni tedy ptát potom znovu. Program si sám pamatuje, že se podmínka nesplnila a přejde do větve else. Ukažme si to na příkladu: Mějme číslo a, kde bude hodnota 0 nebo 1 a po nás se bude chtít, abychom hodnotu prohodili (pokud tam je 0, dosadíme tam 1, pokud 1, dosadíme 0). Naivně bychom mohli kód napsat takto:

var a = 0 // do a si přiřadíme na začátku 0

if a == 0 { // pokud je a 0, dáme do něj jedničku
        a = 1
}

if a == 1 { // pokud je a 1, dáme do něj nulu
        a = 0
}
print(a)

Nefunguje to, že? Pojďme si projet, co bude program dělat. Na začátku máme v a nulu, první podmínka se jistě splní a dosadí do a jedničku. No ale rázem se splní i ta druhá. Co s tím? Když podmínky otočíme, budeme mít ten samý problém s jedničkou. Jak z toho ven? Ano, použijeme else.

var a = 0 // do a si přiřadíme na začátku 0

if a == 0 { // pokud je a 0, dáme do něj jedničku
        a = 1
} else { // pokud je a 1, dáme do něj nulu
        a = 0
}

print(a)

Podmínky je možné skládat a to pomocí dvou základních logických operátorů:

Operátor C-like Zápis
A zároveň &&
Nebo ||

Uveďme si příklad:

print("Zadejte číslo v rozmezí 10-20:")
let a = Int(readLine()!)!
if a >= 10 && a <= 20 {
        print("Zadal jsi správně")
} else {
        print("Zadal jsi špatně")
}

S tím si zatím vystačíme, operátory se pomocí závorek samozřejmě dají kombinovat.

print("Zadejte číslo v rozmezí 10-20 nebo 30-40:")
let a = Int(readLine()!)!
if ((a >= 10) && (a <= 20)) || ((a >=30) && (a <= 40)) {
        print("Zadal jsi správně")
} else {
        print("Zadal jsi špatně")
}

Switch

Konstrukce switch je převzatá z jazyka C (jako velká část gramatiky Swift). Umožňuje nám zjednodušit (relativně) zápis více podmínek pod sebou. Vzpomeňme si na naši kalkulačku v prvních lekcích, která načetla 2 čísla a vypočítala všechny 4 operace. Nyní si ale budeme chtít zvolit, kterou operaci chceme. Bez switche bychom napsali kód podobný tomuto:

print("Vítejte v kalkulačce")
print("Zadejte první číslo:")
let a = Double(readLine()!)!
print("Zadejte druhé číslo:")
let b = Double(readLine()!)!

print("Zvolte si operaci:")
print("1 - sčítání")
print("2 - odčítání")
print("3 - násobení")
print("4 - dělení")
let volba = Int(readLine()!)!
var vysledek : Double = 0

if volba == 1 {
        vysledek = a + b
} else if volba == 2 {
        vysledek = a - b
} else if volba == 3 {
        vysledek = a * b
} else if volba == 4 {
        vysledek = a / b
}

if (volba > 0) && (volba < 5) {
        print("Výsledek: \(vysledek)")
} else {
        print("Neplatná volba")
}

print("Děkuji za použití kalkulačky, aplikaci ukončíte libovolnou klávesou.")

Vítejte v kalkulačce
Zadejte první číslo:
3,14
Zadejte druhé číslo:
2,72
Zvolte si operaci:
1 - sčítání
2 - odčítání
3 - násobení
4 - dělení
2
Výsledek: 0,42
Děkuji za použití kalkulačky, aplikaci ukončíte libovolnou klávesou.

Všimněte si, že jsme proměnnou vysledek deklarovali na začátku, jen tak do ni můžeme potom přiřazovat. Kdybychom ji deklarovali u každého přiřazení, Swift by kód nezkompiloval a vyhodil chybu redeklarace proměnné. Proměnná může být deklarována (založena v paměti) vždy jen jednou. Bohužel Swift není schopen poznat, zda je do proměnné vysledek opravdu přiřazena nějaká hodnota. Ozve se při výpisu na konzoli, kde se mu nelíbí, že může vypisovat proměnnou, která nemá přiřazenu hodnotu. Z tohoto důvodu na začátku dosadíme do vysledek nulu.

Další vychytávka je kontrola správnosti volby. Program by v tomto případě fungoval stejně i bez těch else, ale nač se dále ptát, když již máme výsledek.

Nyní si zkusíme napsat ten samý kód pomocí switche:

print("Vítejte v kalkulačce")
print("Zadejte první číslo:")
let a = Double(readLine()!)!
print("Zadejte druhé číslo:")
let b = Double(readLine()!)!

print("Zvolte si operaci:")
print("1 - sčítání")
print("2 - odčítání")
print("3 - násobení")
print("4 - dělení")
let volba = Int(readLine()!)!
var vysledek : Double = 0

switch (volba) {
        case 1:
                vysledek = a + b
        case 2:
                vysledek = a - b
        case 3:
                vysledek = a * b
        case 4:
                vysledek = a / b
        default:
                break
}

if (volba > 0) && (volba < 5) {
        print("Výsledek: \(vysledek)")
}
else {
        print("Neplatná volba")
}

print("Děkuji za použití kalkulačky, aplikaci ukončíte libovolnou klávesou.")

Vidíme, že kód je trochu přehlednější. Pokud bychom potřebovali v nějaké větvi switche spustit více příkazů, překvapivě je nebudeme psát do {} bloku, ale rovnou pod sebe. Pokud přecházíte z nějakého jiného programovacího jazyka, nemusíte ukončovat každý case pomocí break, aby se náhodou neprovedly další. Swift v případě switch vždy provede pouze jeden case. Konstrukce switch může místo case x: obsahovat ještě možnost default:, která se vykoná v případě, že nebude platit žádný case. Default byste prakticky měli mít vždy, jen pokud byste náhodou přes case pokryli všechny možnosti, tak není potřeba. Prakticky to půjde ale pouze s Boolean a na to zas nemá smysl dělat switch. Je jen na vás, jestli budete switch používat, obecně se vyplatí jen při větším množství příkazů a vždy jde nahradit sekvencí if a else. Samozřejmě lze použít switch i pro hodnoty stringové proměnné.

V příští lekci, Cykly ve Swift, se budeme věnovat cyklům.


 

Stáhnout

Staženo 1x (94.66 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?
2 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)
Miniatura
Všechny články v sekci
Základní konstrukce jazyka Swift
Miniatura
Následující článek
Cvičení k 4. lekci Swift
Aktivity (8)

 

 

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