2. diel - Premenné, typový systém a parsovanie vo Swift
Z minulej lekcie Swift kurzu, Úvod do jazyka Swift, platformy a Xcode , už vieme pracovať s Xcode a
vytvoriť Playground pre spúšťanie kódu. Dnes sa v Swift tutoriálu pozrieme
na tzv. Typový systém, ukážeme si základné dátové typy a prácu s
premennými. Tiež dôjde reč na rozdiel medzi kľúčovými slovami
var
a let
.
Premenné
Než začneme riešiť dátové typy, poďme sa zhodnúť na tom, čo je to
premenná (programátori mi teraz iste odpustí zbytočné vysvetľovanie).
Určite poznáte z matematiky premennou (napr. x
), do ktorej sme si
mohli uložiť nejakú hodnotu, najčastejšie číslo. Premenná je v
informatike úplne to isté, je to miesto v pamäti počítača, kam si môžeme
uložiť nejaké dáta (meno používateľa, aktuálny čas alebo databázu
článkov). Toto miesto má podľa typu premennej tiež vyhradenú určitú
veľkosť, ktorú premenná nesmie presiahnuť (napr. Číslo nesmie byť
väčšie ako 2 147 483 647).
Premenná má vždy nejaký dátový typ, môže to byť číslo, znak, text a podobne, záleží na tom, na čo ju chceme používať. Väčšinou musíme pred prácou s premennou túto premennú najskôr tzv. Deklarovať, či povedať jazyku ako sa bude volať a akého dátového typu bude (aký v nej bude obsah). Jazyk ju v pamäti založia a až potom s ňou môžeme pracovať. Podľa dátového typu premennej si ju jazyk dokáže z pamäti načítať, modifikovať, prípadne ju v pamäti založiť. O každom dátovom typu jazyk vie, koľko v pamäti zaberá miesta a ako s týmto kusom pamäte pracovať.
Typový systém
Existujú dva základné typové systémy: statický a dynamický:
- Dynamický typový systém nás plne odtieňuje od toho, že premenná má vôbec nejaký dátový typ. Ona ho samozrejme vnútorne má, ale jazyk to nedáva najavo. Dynamické typovanie ide mnohokrát tak ďaleko, že premenné nemusíme ani deklarovať, akonáhle do nejakej premennej niečo uložíme a jazyk zistí, že nebola nikdy deklarovaná, sám ju založí. Do tej istej premennej môžeme ukladať text, potom objekt používateľa a potom desatinné číslo. Jazyk sa s tým sám pobije a vnútorne automaticky mení dátový typ. V týchto jazykoch ide vývoj rýchlejšie vďaka menšiemu množstvo kódu, zástupcovia sú napr. PHP alebo Ruby.
- Statický typový systém naopak striktne vyžaduje definovať typ premennej a tento typ je ďalej nemenný. Akonáhle premennú raz deklarujeme, nie je možné jej dátový typ zmeniť. Akonáhle sa do textového reťazca pokúsime uložiť objekt užívateľ, dostaneme vynadané.
Swift je staticky typizovanom jazyk, všetky premenné majú pevne daný dátový typ, ten ale ako programátor nemusíte toľko riešiť. Kompilátor sám "na pozadí" doplní vhodný dátový typ, môžete ho ale určiť aj explicitne. Obrovskou výhodou je, že nám kompiler pred spustením skontroluje, či všetky dátové typy sedia. Dynamické typovanie síce vyzerá ako výhodné, ale zdrojový kód nie je možné automaticky kontrolovať a keď niekde očakávame objekt používateľ a príde nám tam namiesto toho desatinné číslo, odhalí sa chyba až za behu a interpret program zhodí. Naopak Swift nám nedovolí program ani skompilovať a na chybu nás upozorní (to je ďalšia výhoda kompilácia).
Poďme si teraz niečo naprogramovať, nech si nadobudnuté vedomosti trochu osvojíme, s teóriou budeme pokračovať až nabudúce. Povedzme si teraz tri základné dátové typy:
- Celé čísla:
Int
- Desatinné čísla:
Double
- Textový reťazec:
String
Práca s premennými
Skúsime si nadeklarovat celočíselnú premennú a
, dosadiť do
nej číslo 56
a "celé" to spustiť v Playground. Môžete si
založiť nový alebo použiť ten z predchádzajúcej lekcie.
var a : Int a = 56
Prvý príkaz nám nadeklaruje novú premennú a
dátového typu
Int
. Premenná teda bude slúžiť na ukladanie
celých čísel. Druhý príkaz vykonáva priradenie do premennej, slúži na to
operátor "rovná sa" (=
). Mohli by sme to skrátiť a všetko
vykonať v jednom kroku.
var a = 56
Kompilátor sám spozná, že hodnote 56
najlepšie zodpovedá
dátový typ Int
a na pozadí ho doplní.
Samozrejme by ste mohli využiť aj dlhší zápis:
var a : Int = 56
Vo Swiftu sa ale väčšinu času dátové typy takto nešpecifikujú. Pre desatinnú premennú by kód vyzeral takto:
var a : Double a = 56.6
Je to takmer rovnaké ako s celočíselným. Ako desatinný oddeľovač
používame bodku (.
).
var
vs. let
Zatiaľ sme sa u premenných zoznámili so slovkom var
, ktoré
práve premennú označuje. Častejšie ale vo svete Swift stretnete podobné
slovko let
. To slúži pre deklarácii konštanty,
ktorú nie je ďalej možné modifikovať. Pretože v bežnom programovaní je
takých hodnôt väčšina, používa sa primárne
let
a var
iba v
prípade, že plánujete premennú meniť. let
vám zaistí, že má konštanta vždy hodnotu, ktorú ste priradili a nestane
sa vám, že by nejaká časť kódu omylom menila hodnotu vašich
premenných.
Funkčnosť let
si môžeme ľahko overiť napríklad takto:
let a : Int a = 56 a = 22
Ako môžete vidieť, Playground zobrazí chybu, pretože nie je možné
meniť hodnotu let
konštanty.
Program Papagáj
Minulý program bol trochu nudný, skúsme nejako reagovať na vstup od
užívateľa. Napíšeme program papagáj, ktorý bude dvakrát opakovať to,
čo používateľ napísal. Ešte sme neskúšali z konzoly nič načítavať,
ale je to veľmi jednoduché. Zároveň vám nebude stačiť Playground ale
potrebujete Command Line Tool projekt, ktorý sme si ukázali už skôr. Slúži
na to metóda readLine()
, ktorá nám vráti textový reťazec z
konzoly. Skúsme si napísať nasledujúci kód:
{SWIFT}
print("Ahoj, som virtuálne papagáj Lora, rád opakujem!")
print("Napíš niečo: ")
var vstup : String
vstup = readLine()!
var vystup : String
vystup = vstup + ", " + vstup + "!"
print(vystup)
{/SWIFT}
To už je trochu zábavnejšia Prvé dva riadky sú jasné, ďalej deklarujeme textový reťazec
vstup
. Do vstup
sa priradí hodnota z metódy
readLine()
na konzolu, teda to, čo používateľ zadal.
Výkričník za metódou zatiaľ neriešte, slúži na to, aby sme nemuseli
overovať vstup. Pre výstup si pre názornosť zakladáme ďalšie premennú
typu textový reťazec. Zaujímavé je, ako do vystup
priradíme,
tam využívame tzv. Konkatenace (spájanie) reťazcov. Pomocou operátora
+
totiž môžeme spojiť niekoľko textových reťazcov do
jedného a je jedno, či je reťazec v premennej alebo je explicitne zadaný v
úvodzovkách vo zdroj. kódu. Do premennej teda priradíme vstup
,
ďalej čiarku, znovu vstup
a potom výkričník. Premennú
vypíšeme a skončíme.
Ahoj, som virtuálne papagáj Lora, rád opakujem! Napíš niečo: Nazdar vtákovi Nazdar vtákovi, Nazdar vtákovi!
Do premennej môžeme priraďovať už v jej deklarácii, môžeme teda nahradiť:
var vstup : String
vstup = readLine()!
za
let vstup = readLine()!
Program by išiel skrátiť ešte viac v mnohých ohľadoch. Všeobecne je ale lepšie používať viac premenných a dodržiavať prehľadnosť, než písať čo najkratšie kód a po mesiaci zabudnúť, ako vôbec funguje.
Program zdvojnásobovač
Zdvojnásobovač si vyžiada na vstupe číslo a to potom zdvojnásobí a vypíše. Asi by sme s doterajšími znalosťami napísali niečo takéto:
print("Zadajte číslo k zdvojnásobeniu:") var a : Int = readLine()! a = a * 2 print(a)
Všimnite si zdvojnásobenie čísla a
, ktoré sme vykonali
pomocou priradenia. Swift nám teraz vynadá a podčiarkne riadok, v ktorom sa
snažíme hodnotu z konzoly dostať do premennej typu Int
.
Narážame na typovú kontrolu, konkrétne nám readLine()
vracia
String
a my sa ho snažíme uložiť do Int
.
Čokoľvek príde z textovej konzoly je vždy text a to aj keď zadáme číslo.
Budeme ho potrebovať tzv. Naparsovat.
Parsovanie
Parsováním sa myslí prevod z textovej podoby na nejaký špecifický typ,
napr. Číslo. Často totiž od užívateľa či nejakej služby dostanete dáta
ako String
, ale vy pre výpočty a podobne
potrebujete napríklad Int
alebo
Double
. Parsovanie je vo Swift veľmi jednoduché,
má ale zásadné ale, o ktorom si krátko povieme nižšie. Ak budeme chcieť
naparsovat napr. Int
zo
String
, budeme postupovať takto:
var a = Int("343")
Vidíme, že dátový typ Int
ponúka
konštruktor (metóda vytvárajúce konkrétny premenou, resp. Objekt, ale o tom
neskôr), ktorý berie ako parameter textový reťazec a vytvoria číslo.
Využijeme tejto znalosti v našom programe:
{SWIFT}
print("Zadajte číslo k zdvojnásobeniu:")
let vstup = readLine()!
var a = Int(vstup)! // prípadne Double
a = a * 2
print(a)
{/SWIFT}
Podobne by sme postupovali aj v prípade, že by sa zadávala desatinné
čísla, teda var a = Double(vstup)!
.
Parsovanie sa samozrejme nemusí podariť, keď bude v texte namiesto čísla
napr. " slovo "
. Zatiaľ budeme písať za parsovací
funkcie výkričníky, rovnako ako za všetky funkcie, ktoré sa nemusia
podariť. Podrobnejšie si problematiku vysvetlíme v nasledujúcich
lekciách.
Jednoduchá kalkulačka
Ešte sme nepracovali s desatinnými číslami, skúsme si napísať sľubovanú kalkulačku. Bude veľmi jednoduchá, na vstup prídu dve čísla, program potom vypíše výsledky pre sčítanie, odčítanie, násobenie a delenie.
{SWIFT}
print("Vitajte v kalkulačke")
print("Zadajte prvé číslo:")
let a = Double(readLine()!)!
print("Zadajte druhé číslo:")
let b = Double(readLine()!)!
let soucet = a + b
let rozdil = a - b
let soucin = a * b
let podil = a / b
print("Súčet: \(soucet)")
print("Rozdiel: \(rozdil)")
print("Súčin: \(soucin)")
print("Podiel: \(podil)")
print("Ďakujem za použitia kalkulačky, aplikáciu ukončíte ľubovoľnou klávesou.")
{/SWIFT}
výstup:
Konzolová aplikácia
Vitajte v kalkulačke
Zadajte prvé číslo:
3.14
Zadajte druhé číslo:
2.72
Súčet: 5.86
Rozdiel: 0.42
Súčin: 8.5408
Podiel: 1.15441176470588
Ďakujem za použitia kalkulačky, aplikáciu ukončíte ľubovoľnou klávesou.
Všimnite si dvoch vecí. Po prvé sme zjednodušili parsovanie z konzoly
tak, aby sme nepotrebovali stringové premennú, pretože by sme ju rovnako už
potom nepoužili. Po druhé na konci programu potrebujeme vypísať čísla,
pretože ale funkcia print()
vyžaduje typ String
,
"obalíme" naše čísla (či čokoľvek iné) do \()
. Táto
praktika sa nazýva String Interpolation (interpolácia reťazcov) a na pozadí
skrátka dôjde k vyhodnoteniu výrazu v \()
. Pokojne by ste tu
mohli číslo ešte treba vynásobiť či byť upravená. Pozri nižšie.
print("Súčet: \(a + b)")
V budúcej lekcii, Riešené úlohy k 1.-2. lekciu Swift , si povieme viac o typovom systému a predstavíme si ďalšie dátové typy.
V nasledujúcom cvičení, Riešené úlohy k 1.-2. lekciu Swift, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 114x (134.04 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Swift