Apple Swift – první krůčky v novém programovacím jazyce

9. 6. 2014

Když jsem, jako mnozí z vás, v pondělí pozoroval streaming z keynote letošního WWDC, byl jsem příjemně překvapen. Mnohé z toho, co Apple představil, bylo očekáváno, o jiném se šeptalo, ale jednou z věcí, která pro mě byla naprostým překvapením, bylo představení nového programovacího jazyka Swift, možného nástupce Objective-C. Pojďme se podívat na to, jak v něm začít vyvíjet.

Úvodem

Obr1

Když se řekne “Swift – nový jazyk pro vývoj iOS aplikací”, co vás napadne jako první?

Mě osobně jako první polila hrůza, neb roky vyvíjím iOS aplikací v Objective-C. Za ta léta jsem měl už nejednu možnost té krásce nahlédnout pod sukni a naučil jsem se, jak přestát i její občasné nálady a scény. A teď se zdálo, že mě to celé čeká znovu! Loni Apple vyhodil oknem uživatelské rozhraní a letos jazyk – to byly mé první dojmy.

Ale naštěstí to není úplně pravda. První věc, kterou vám musím prozradit, než vás také polije hrůza, je, že příchod Swiftu neznamená žádnou zkázu Objective-C – alespoň rozhodně ne hned. A zkázu vašich případných aplikací už napsaných v Objective-C neznamená vůbec.

Neboť podobně, jako může v jedné iOS aplikaci existovat kód v C++ i v Objective-C, v ní může být Objective-C se Swiftem.

Odpověď na otázku, zda bude Swift znamenat hrozbu pro Objective-C, si nejenže ještě musíme počkat, ale jakožto vývojáři mobilních aplikací to budeme právě my, kdo tuto bitvu rozhodne.

Nakonec skáču radostí, protože kromě Objective-C vyvíjím i v Ruby on Rails a Swift je Ruby tak blízko, že jsem v něco podobného ani nedoufal. A i když třeba nemáte Ruby background jako já, tak pro vás Swift nebude představovat neřešitelný problém – obzvláště poté, co vám prozradím, že API iOS se nijak nezměnilo – tedy názvy všech metod, tříd, atd. jsou stejné.

Nu, přestaňme chodit okolo horké kaše a vrhněme se na to!

Instalace

První důležitou informací je, že pro vývoj ve Swiftu nepotřebujete Yosemite.

Ale potřebujete nejnovější aktualizaci Mavericks, tedy Mac OS 10.9.3. Takže pokud ještě nemáte staženo, tak nejdříve aktualizujte. A poté je samozřejmě třeba nové Xcode 6 BETA, které je zatím dostupné pouze registrovaným vývojářům.

Xcode 6 je pak možné bez obav nainstalovat i vedle vaší stabilní Xcode 5, nijak ji nerozbije, ani nic podobného. Instalační DMG si stáhnete z Developer portálu a nainstalujete.

Jak to spustit?

Obr2

// Playground – noun: a place where people can play

Po spuštění Xcode 6 BETA je v nabídce nová volba, která slouží ke spuštění playground, což je interaktivní forma jazyka Swift (znalci ruby již léta podobnou věc znají pod názvem irb – její swiftová variace disponuje však navíc grafickým výstupem).

Jak to vypadá?

Obr3

println(“Hello, world”)

První příjemnou věcí je, že jak playground tak i nové Xcode si zachová všechna barevná témata, která jste měli v předchozí verzi včetně mého VibrantInk. Bohužel však vaše vlastní téma pro Objective-C už nezobrazí Swift kód tak krásně barevně – ale to není nic, co by se nedalo napravit úpravou tématu.

Zdrojový kód v Objective-C měl koncovku .m, kód v jazyce Swift má koncovku .swift.

Co je nového?

Ještě než se pustíme do samotného Swiftu, je tu jedna zajímavost přímo v novém Xcode – a sice nový mód simulátoru “Resizable iPhone” a “Resizable iPad”.

Obr4

Okno tohoto nového módu simulátoru sice vypadá děsivě, ale možná tu konečně máme odpověď na otázku neustálého přepínání mezi 5 a 4S simulátory kvůli velikosti displeje.

Jazyk Swift

Teď už se ale pojďme zaměřit na jazyk samotný. V čem že se tedy liší od Objective-C?

Type Inference & Type Safety

Na rozdíl od Objective-C, které je dynamicky typovaným jazykem (= taktéž slabě typovaným, informace o datových typech nejsou známy v době kompilace), podporuje Swift silné datové typy – je tedy staticky typovaným jazykem (ano, existují z tohoto vyjímky). Tedy už v době kompilace zná kompilátor celý typ každého objektu (až na určité specifické případy). V důsledku tohoto má možnost mnohem více a lépe optimalizovat kód už během kompilace.

A mimo jiné už v době kompilace je díky tomuto možné odhalit řadu chyb, které bylo možné v Objective-C odhalit až v runtime (= při spuštění programu). A pro vyřešení některých jiných s tímto souvisejících situací musel často vývojář použít reflexi (vzpomínáte na volání respondsToSelector v podmínkách při volání metod protokolů?). Tak ve Swiftu už tato volání dělat nebudeme. Tomu se říká typová bezpečnost, nebo-li type safety.

Možná si teď říkáte:

“Ale jak to? Vždyť já jsem do kódu vždy psal v Objective-C datové typy, ne?”

Ano, to je nás více, ale neznamená to, že by bylo Objective-C silně typovaný jazyk. Objective-C totiž podporuje tzv. type hinting (stejnou věc má BTW například jazyk Dart). Type hinting je taková pomůcka, kterou se Xcode (resp. LLVM toolchain, konkrétně Clang) snažil řešit právě onen nedostatek Objective-C, že je slabě typovaný.

Pomocí type hintingu mohl vývojář kompilátoru sdělit typ dané proměnné, a kompilátor na základě toho může vytvořit varování (která Xcode interpretuje jako chyby kompilace). Ale jednak lze Clang spustit s příznakem, aby tato varování ignoroval a jednak vývojář může v Objective-C jako datový typ všude uvést id a program se stejně zkompiluje a spustí (a bude i fungovat).

Do kódu v jazyce Swift je možné datové typy psát, ale není to nutné. Nutné to není díky tomu, že kromě toho, že je silně typovaný (= staticky typovaný), totiž podporuje i type inference.

Díky type inference si je kompilátor schopen odvodit datový typ proměnné na základě dat, která do ní programátor uloží – ale narozdíl od dynamicky typovaných jazyků se toto odvození děje v compile time (tedy během kompilace) na základě informací, které jsou v tu dobu známy.

Díky tomu dovede Swift kompilátor mnohem lépe optimalizovat volání metod. Objective-C používá k volání metod dynamic dispatch. Swift naproti tomu, díky silným datovým typům, používá podobný přístup jako C++ se své vtable. Což je mnohem rychlejší způsob. Nicméně Swift je kompatibilní s Objective-C Runtime a tudíž může v případě potřeby rovněž používat dynamic dispatch přes Objective-C Runtime.

Ukázka vytvoření proměné s manuálně definovaným datovým typem a pomocí typové inference může vypadat například takto:

// type inference
var coolLanguage = "Swift"

// explicit typing
var anotherNotSoCoolLanguage:String = "Objective-C"

Generika

Druhou novinkou a vlastností jazyka Swift, o které si dnes povíme, je podpora generik. V Objective-C, který bylo dynamicky typovaným jazykem, nebyla absence podpory generik zásadním problémem, nicméně ve staticky typovaném jazyce, jakým je Swift, bychom bez ní řadu situací řešili velmi obtížně. Což bylo patrně jedním z důvodů, proč ji inženýři z Applu do jazyka integrovali.

Příkladem použití generik může být situace, kdy si chceme vytvořit například třídu (nebo ve Swiftu to může být i struktura – struct) popisující jakýsi dopravní prostředek – třeba transportér (Transporter). A chceme říci, že by měl umět transportovat pouze instance tříd, které implementují nějaký konkrétní protokol (třeba Cargoable).

V Objective-C bychom tento problém vyřešili pomocí metod respondsToSelector (= ducktyping), nebo conformsToProtocol (reflexe).

V jazyce Swift můžeme stejnou situaci vyřešit pomocí generik:

struct Transporter<T: Cargoable> {
    let a: T!

    init(a: T) {
        self.a = a
    }

    func showCargo() -> T {
        return a
    }
}

Jak se to naučit?

Kde najdu nějaký autoritativní zdroj?

Určitě prosím nepovažujte tento můj článek za manuál, nebo tutoriál jak se Swift naučit, spíše by to mělo být takové šťouchnutí, které by vás mělo navnadit k tomu, abyste si přečetli toto: Swift by Apple – Apple samotný vydal o Swiftu perfektní knihu. Určitě si ji přečtěte, je dostupná zdarma, a je v anglickém jazyce.

A určitě se také podívejte, jak vypadá implementace jednoduché FlappyBird like hry ve Swiftu (Flappy Bird ve Swiftu). A pohrajte si s Playground!

A ještě jedna dobrá zpráva – dalším skvělý odrazovým můstkem pro znalce Objective-C může být to, že všechny šablony pro nové projekty v Xcode (a ne že bych jich bylo kdovíjak mnoho) jsou nyní dostupné jak v Objective-C, tak ve Swiftu!

Závěrem

Zaujal vás Swift?

Už jste si něm něco zkoušeli vytvořit? Podělte se o své zkušenosti v komentářích.

Měli byste zájem o další díl, kde bychom si ukázali další vlastnosti jazyka Swift?

A kdybyste se chtěli o Swiftu něco dozvědět i osobnější formou, tak určitě přijďte na For-Mobile 24. 6. od 19:00 do Dejvic, který je zasvěcený Swiftu od začátku až do konce.

O Autorovi

Ing. Tomáš Jukin

Tomáš se narodil v roce 1988, v únoru 2014 absolvoval Softwarové Inženýrství na ČVUT FIT a dnes vytváří šťavnaté mobilní aplikace ve společnosti Juicymo, kterou před rokem založil se svou kolegyní Janou Moudrou. Tomáš se věnuje vývoji pro iOS už od verze 3.0 (tehdy se mu ještě říkalo iPhone OS), kromě toho je velkým evangelistou a vývojářem v Ruby on Rails. O vývoji aplikací pro iPhone i o Ruby on Rails přednáší na Unicorn College, nasazení těchto technologií konzultuje a školí o nich. Také je zakladatelem pražské komunity vývojářů mobilních aplikací For-Mobile a je jedním z významných organizátorů GUG.cz – možná jste se účastnili pražského DevFestu v roce 2013, jehož byl Tomáš hlavním organizátorem. A když Tomáš zrovna něco nepořádá, nevyvíji nebo někde nepřednáší, tak zkoumá Multi-Agentní Systémy. Na Twitteru vystupuje jako @Inza.

Redaktor si nevyplnil profil

Nový komentář

Musíte se přihlásit.

jiriknesl

25. 6. 2014, 11:42:00
reply

Myslím, že není tak úplně pravda, že by byl dynamic dispatch o tolik pomalejší. Dnes je běžné, že se ty cally kešují ( B-Tree z toho udělá operaci s nízkou složitostí O=log(n)) a výkonnostní dopad sice existuje, ale obvykle v něm aplikace nestráví ani 1 % času. Při výběru jazyka bych určitě koukal na jiné věci, a to i v případě, že součástí zadání je maximální výkonnost. Jinak díky za článek.

Marek Žehra

9. 6. 2014, 15:21:00
reply

Super úvod. Další článek by rozhodně stál za hřích a rád si přečtu i celou sérii, pokud plánuješ :)