IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

2. diel - Prvý objektová aplikácie vo Swift

Minulá lekcie, Úvod do objektovo orientovaného programovania vo Swift , nás uviedla do objektovo orientovaného programovania. Už vieme, že objekty majú atribúty a metódy. Tiež vieme, že na vytvorenie objektu vytvoríme najprv triedu. Tá je vzorom, podľa ktorého následne tvoríme jej inštancie.

Na začiatku kurzu sa základnými konštrukciami jazyka Swift sme si vytvorili program Hello world. Urobme si teraz podobný program ako úvod do objektovo orientovaného programovania. Naprogramujte si Hello object world!

Založme si v Xcode novú konzolovú aplikáciu (Command Line Tool) tak, ako sme to robili doteraz. V Project navigator naľavo (výpis súboru projektu) klikneme pravým tlačidlom myši na priečinok nášho projektu a vyberieme "New File ...".

Pridanie nového súboru v Xcode - Objektovo orientované programovanie vo Swift

V zobrazenom dialógu vyberieme možnosť "Swift File" a pokračujeme kliknutím na "Next". Nový súbor pomenujeme Zdravic.swift a potvrdíme. Názov triedy píšeme vždy ťavie notáciou bez medzier a na rozdiel od premenných má každé slovo veľké prvé písmeno, teda aj prvé. Názov je samozrejme tiež bez diakritiky, tú v programe používame max. Vnútri textových reťazcov, nie v identifikátoroch.

Vytvorenie triedy vo Swift v Xcode - Objektovo orientované programovanie vo Swift

Máme pred sebou nový zdrojový súbor. V zakomentované časti môžete vidieť napr. Informácie o dátume vytvorenie a nechýba import Foundation pre import základnej časti jazyka Swift. Triedu si musíme deklarovať sami, nie je to ale nič ťažké:

class Zdravic {

}

Podľa tejto triedy neskôr vytvoríme objekt zdravic, ktorý nás bude vedieť pozdraviť. Vidíme, že sa na program už pozeráme úplne inak, za každú akciu je zodpovedný nejaký objekt, nestačí iba niečo "nabušit" do súboru main.swift. V našom prípade vám to môže prísť zbytočné, pri zložitejších aplikácií si to budete pochvaľovať :)

Vo Swift nie sú triedy zaradené do balíčkov alebo menných priestorov, ako je tomu v niektorých ostatných programovacích jazykoch. Namiesto toho je základnou jednotkou Swift súbor, pričom nie je nutné mať všetok kód vnútri nejaké triedy. Prakticky sa tak často vytvára napr. Súbor Constants.swift, kde sú iba String konštanty deklarované pomocou let, aby boli na jednom mieste a nemohli ste si omylom spôsobiť problémy preklepom.

Druhou "jednotka" v jazyku Swift sú moduly. Apple je definuje ako "single unit of distribution". Modul je skrátka niečo, čo v sebe obsahuje zamýšľanú funkcionalitu a dá sa použiť v rôznych programoch. Náš nový projekt je vlastne tiež modul sám o sebe, ale nedáva zmysel ho využiť v iných aplikáciách. Rovnako tak Foundation je modul, alebo neskôr UIKit, ktorý sa importuje ako základ v iOS aplikáciách miesto Foundation (pretože Foundation obsahuje).

Teraz si do triedy Zdravic pridáme metódu pozdrav(), bude verejne viditeľná a nebude mať žiadnu návratovú hodnotu ani parametre.

Deklarácia metódy vo Swift je teda nasledovné:

[modifikátor přístupu] func [jmenoMetody]([parametry]) -> [návratový typ]

Pred metódou nemusí byť tzv. Modifikátor prístupu, ako predvolený používa Swift modifikátor internal, ktorý znamená prístup v rámci modulu (takže v našom prípade celá konzolová aplikácie). Ďalej bude nasledovať samotný názov metódy, metódy píšeme rovnako ako triedy ťavej notáciou s malým poč. Písmenom. Zátvorka s parametrami je povinná, my ju necháme prázdnu, pretože metóda žiadne parametre mať nebude. Do tela metódy zapíšeme kód pre výpis na konzolu.

Naša trieda bude teraz vyzerať takto:

class Zdravic {

    func pozdrav() {
        print("Hello object world!")
    }

}

Tu sme zatiaľ skončili, prejdeme do main.swift.

Teraz si v súbore main vytvoríme inštanciu triedy Zdravic. Bude to teda ten objekt zdravic, s ktorým budeme pracovať. Objekty sa ukladajú do premenných, názov triedy slúži ako dátový typ. Inštancia má spravidla názov triedy, len má prvé písmeno malé. Vyhlásiť si premennú a následne v nej založme novú inštanciu triedy Zdravic:

let zdravic : Zdravic
zdravic = Zdravic()

Prvý riadok hovorí: "Chcem premennú zdravic, v ktorej bude inštancie triedy Zdravic ". S premennými sme vlastne už takto pracovali. Na prvom riadku vykonávame iba deklaráciu, takže možno využiť let. Po prvom priradení už nebude možné do premennej zdravic priradiť novú inštanciu.

Na druhom riadku založíme novú inštanciu triedy Zdravic pomocou okrúhlych zátvoriek. Túto inštanciu priradíme do našej premennej.

Pri vytvorení novej inštancie sa zavolá tzv. Konštruktor. To je špeciálna metóda na triede, preto pri vytvorení inštancie píšeme tie prázdne zátvorky, keďže voláme túto "vytvárajúci" metódu. Konštruktor spravidla obsahuje nejakú inicializáciu vnútorného stavu inštancie (napr. Dosadí východiskové hodnoty do premenných). My sme v kóde žiadny konštruktor nedeklaroval, Swift si preto vytvoril tzv. Implicitné bezparametrický konštruktor. Vytvorenie inštancie objektu je teda podobné volanie metódy. Celý zápis môžeme samozrejme skrátiť na:

let zdravic = Zdravic()

Keďže v premennej teraz máme naozaj inštanciu triedy Zdravic, môžeme inštanciu nechať pozdraviť. Zavoláme na ňu metódu pozdrav() a to ako zdravic.pozdrav(). Kód súbor main.swift bude teda teraz vyzerať nasledovne:

let zdravic : Zdravic
zdravic = Zdravic()

zdravic.pozdrav()
class Zdravic {

    func pozdrav() {
        print("Hello object world!")
    }
}

Program spustíme.

Hello object world!

Máme teda svoju prvú objektovú aplikáciu!

Dajme teraz našej metóde pozdrav() parameter jmeno, aby dokázala pozdraviť konkrétneho užívateľa:

func pozdrav(jmeno: String) {
        print("Ahoj uživateli \(jmeno)!")
}

Vidíme, že syntax parametra metódy je rovnaká, ako syntaxe premenné. Keby sme chceli parametrov viac, oddeľujeme ich čiarkou. Upravíme teraz náš súbor main.swift:

let zdravic : Zdravic
zdravic = Zdravic()

zdravic.pozdrav(jmeno: "Karel")
zdravic.pozdrav(jmeno: "Petr")
class Zdravic {

    func pozdrav(jmeno: String) {
        print("Ahoj uživateli \(jmeno)!")
    }
}

Náš kód je teraz v metóde a my ho môžeme jednoducho pomocou parametrov volať znova s rôznymi parametrami. Nemusíme 2x opisovať "Ahoj užívateľovi ...". Kód budeme odteraz deliť logicky do metód. Odlišnosťou od radu jazykov je vo Swift prítomnosť názvov parametrov pri volaní metódy. V našom prípade jmeno, bez neho nebude program fungovať. Ak by sme chceli dať názvy parametrov preč z volania, využijeme v deklarácii metódy _ pred názvom parametra. Pri volaní ho potom písať nebudeme.

func pozdrav(_ jmeno: String) {
     print("Ahoj uživateli \(jmeno)!")
}

Volanie metódy by vyzeralo takto:

zdravic.pozdrav("Karel")

výstup:

Ahoj uživateli Karel!
Ahoj uživateli Petr!

Triede pridáme nejakú vlastnosť, ponúka sa text, kde bude uložený text pozdravu. Vlastnosti sa definujú rovnako, ako premenné. Ako u metód platí, že pred nich píšeme modifikátor prístupu, bez neho je Swift opäť berie ako internal, čo nám vyhovuje. Upravme našu triedu:

class Zdravic {

    var text: String = ""

    func pozdrav(_ jmeno: String) {
        print("\(text) \(jmeno)!")
    }
}

Vlastnosť text sme si nastavili na prázdny String, pretože inak by sme museli riešiť Optional alebo vlastné konštruktor. Text teraz musíme pochopiteľne nastaviť vytvorené inštanciu v main.swift:

let zdravic = Zdravic()
zdravic.text = "Ahoj uživateli"
zdravic.pozdrav("Karel")
zdravic.pozdrav("Petr")
zdravic.text = "Vítám tě tu programátore"
zdravic.pozdrav("Richard")
class Zdravic {

    var text: String = ""

    func pozdrav(_ jmeno: String) {
        print("\(text) \(jmeno)!")
    }
}

výstup:

Ahoj uživateli Karel!
Ahoj uživateli Petr!
Vítám tě tu programátore Richard!

Vzhľadom k objektovému návrhu nie je najvhodnejšie, aby si každý objekt ovplyvňoval vstup a výstup, ako sa mu zachce. Pochopiteľne narážam na naše vypisovanie do konzoly. Každý objekt by mal mať určitú kompetenciu a tú by nemal prekračovať. Povera náš objekt iba zostavením pozdravu a jeho výpis si spracujeme už mimo, v našom prípade v súbore main.swift. Výhodou takto navrhnutého objektu je vysoká univerzálnosť a znovupoužitelnost. Objekt doposiaľ vie len písať do konzoly, my ho však prispôsobíme tak, aby daná metóda text iba vracala a bolo na jeho príjemcovi, ako s ním naloží. Takto môžeme pozdravy ukladať do súborov, písať na webové stránky alebo ďalej spracovávať.

Keďže chceme, aby metóda vracala hodnotu a to String, pridáme návratový typ String. K návratu hodnoty použijeme príkaz return. Return metódu ukončí a navráti hodnotu, akýkoľvek kód v tele metódy po return sa už nevykoná! Upravme obe triedy:

Metóda pozdrav() v Zdravic.swift:

func pozdrav(_ jmeno: String) -> String {
        return "\(text) \(jmeno)!"
}

Upravený kód v main.swift:

let zdravic = Zdravic()
zdravic.text = "Ahoj uživateli"
print(zdravic.pozdrav("Karel"))
print(zdravic.pozdrav("Petr"))
zdravic.text = "Vítám tě tu programátore"
print(zdravic.pozdrav("Richard"))
class Zdravic {

    var text: String = ""

    func pozdrav(_ jmeno: String) -> String {
        return "\(text) \(jmeno)!"
    }
}

Teraz je náš kód podľa dobrých praktík.

A sme u konca. Nami napísaný program má už nejakú úroveň, aj keď vlastne nič nerobí. Za úlohu máte prerobiť si našu konzolovú kalkulačku do objektov. V budúcej lekcii, Riešené úlohy k 1.-2. lekciu OOP vo Swift , si urobíme takú jednoduchú hračku, necháme dva objekty (bojovníkmi) súperiť v aréne (tiež objektu). Máte sa na čo tešiť ;-)

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


 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 29x (17.9 kB)

 

Predchádzajúci článok
Úvod do objektovo orientovaného programovania vo Swift
Všetky články v sekcii
Objektovo orientované programovanie vo Swift
Preskočiť článok
(neodporúčame)
Riešené úlohy k 1.-2. lekciu OOP vo 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