Přednáška o metaprogramování ve Swiftu
Publikováno: 11.5.2018
Určitě jste již zažili error “Unexpectedly found nil while unwrapping an Optional value”, když jste se pokoušeli inicializovat UIImage pomocí názvu obrázku, ve kterém jste měli překlep. Nebylo by fajn mít statickou množinu…
Určitě jste již zažili error “Unexpectedly found nil while unwrapping an Optional value”, když jste se pokoušeli inicializovat UIImage pomocí názvu obrázku, ve kterém jste měli překlep. Nebylo by fajn mít statickou množinu názvů a přitom využívat autocomplete Xcode-u? Určitě ano, představte si ale, že už nikdy nebudete muset psát nudný boilerplate kód. V následujících odstavcích se vám pokusím ukázat jak je možné využít metaprogramování v každodenním životě iOS developera.
Před tím, než se budeme věnovat této technice ve Swiftu, bylo by dobré vědět, co to vlastně metaprogramování obecně je.
Definice z Wikipedie je poměrně srozumitelná:
“Metaprogramování je skupinou programovacích technik, které umožňují psaní programů, které vytváří další programy nebo s nimi nakládají jako se svými daty. Případně se může jednat o programy, které při svém běhu mohou dělat činnosti, které by jinak musely provádět již při kompilaci.”
Volně by se dalo říci, že metaprogramování je jednoduše tvorba kódu, jehož výsledkem je další kód. Už z definice vyplívá rozdělení na “compile time” a “runtime”.
Do skupiny metaprogramů patří například:
- Parsery
- Doménově specifické jazyky (DSLs)
- Kompilátory
- Interpretery
Tak a teď k věci, jak je možné využít metaprogramování v každodenním životě iOS vývojáře? Je obecně známo, že momentální stav Swift runtimu toho neumožňuje hodně, proto zůstává použití “compile time” technik. V úvodu jsem zmínil, že by bylo fajn mít statickou množinu obrázků. Přesně na tento účel je určena aplikace SwiftGen, která automaticky potřebný kód generuje a to nejen pro obrázky ale i pro fonty, lokalizované texty a podobně. SwiftGen je pěkný příklad metaprogramu.
Ještě donedávna byla implementace Hashable a Equatable protokolů další každodenní nepříjemnost iOS developera. Od nové verze Xcode-u je sice tento problém automaticky vyřešený (metaprogramování at it’s best), ale je to jen špička ledovce.
Když Apple vytvořil Swift, potřeboval, aby ho podporoval Xcode. Přesně proto vznikl SourceKit, který umožnil parsování zdrojového kódu, zvýraznění syntaxe, odsazení kódu, autocomplete, generování hlaviček a podobně. Existence SourceKitu umožnila vznik několika zajímavých nástrojů, mezi nimi i aplikace Sourcery.
Sourcery je aplikace, která použitím SourceKit-u skenuje zdrojový kód, nabytá data jsou potom dostupná v šablonách, díky tomu je možné generovat libovolné řešení. Šablony mohou být napsané v jazycích Swift, Stencil nebo JavaScript. Stencil je jednoduchý šablonový jazyk, který je jako stvořený pro tvorbu jednoduchých šablon. V šablonách psaných v jazyku Swift je možné využít takřka všechny jeho funkce, nevýhodou je však jeho rychlost.
Chtěli byste vědět jak vytvořit podobné šablony ve Swiftu a nebo v Stencilu? Přijďte si poslechnout můj talk na #blueberryMeetUp nazvaný Three iOS related talks 14. 5. od 19.00 hodin do Blueberry.