sviftTakéSwift lang, Apple Swift, Swift programming languagePokročilý

Definice

Swift je kompilovaný programovací jazyk od Applu, představený v roce 2014, který je hlavním jazykem pro vývoj aplikací na iOS, iPadOS, macOS, watchOS a visionOS. Swift kombinuje statickou typovou kontrolu, typy s volitelnou hodnotou (optionals) a správu paměti přes ARC. Jazyk je open source a běží i na Linuxu a Windows.

Kategorie: Mobilní vývojAktualizováno

Nezaměňujte: Swift jako programovací jazyk Applu nemá nic společného se SWIFT (Society for Worldwide Interbank Financial Telecommunication), sítí pro mezibankovní platební zprávy.

Než se na to spolehnete: Konkrétní verze u striktní kontroly souběžnosti (Swift 6) záměrně neuvádím číslem, protože se pravidla migrace mění; ověřte prosím aktuální stav v Apple dokumentaci. Odkaz na český článek Wikipedie o Swiftu jsem uvedl podle očekávaného názvu, může být přesměrován.

Proč Apple opustil Objective-C

Objective-C nesl dědictví jazyka C: ukazatele, nulové zprávy, ruční práci s hlavičkovými soubory a syntaxi, která odrazovala nováčky. Swift měl tuhle zátěž odstranit, aniž by ztratil přístup ke stávajícím knihovnám. Proto Swift umí volat Objective-C kód i naopak a obě vrstvy mohou v jednom projektu koexistovat. Zásadní změnou je typový systém: kompilátor odmítne přeložit kód, který by mohl sáhnout na neexistující hodnotu.

Optionals a bezpečnost hodnot

Optionals jsou nejvýraznější rys jazyka. Proměnná typu String nikdy nesmí být prázdná reference; pokud hodnota chybět může, typ se zapíše jako String? a k obsahu se nedostanete bez explicitního rozbalení. Tím Swift převádí celou třídu chyb za běhu na chyby při kompilaci. Nástroje jako if let, guard let a operátor ?? dělají práci s chybějícími hodnotami čitelnou.

Jak Swift hlídá paměť

Swift nepoužívá garbage collector. Místo toho počítá reference pomocí ARC (Automatic Reference Counting), který kompilátor vkládá do kódu automaticky. Objekt zaniká ve chvíli, kdy na něj přestane ukazovat poslední silná reference. Výhodou je předvídatelné uvolňování bez pauz, nevýhodou riziko cyklů: dva objekty, které drží jeden druhého, se neuvolní nikdy. Řešením jsou weak a unowned reference, typicky u delegátů a u closures zachytávajících self.

Souběžnost od Swiftu 5.5

Původně se asynchronní kód psal přes callbacky a GCD, což vedlo k hluboko vnořeným uzávěrům. Swift 5.5 přinesl async/await, strukturovanou souběžnost a aktory. Aktor je typ, který sériově chrání svůj vnitřní stav, takže dva úkoly nemohou zapisovat do stejné proměnné současně. Novější verze jazyka posunuly kontrolu datových závodů do kompilátoru pod hlavičkou striktní kontroly souběžnosti, což u větších projektů znamená nutnost migrace.

Kde Swift běží mimo Apple

Jazyk je od roku 2015 open source a vyvíjí se veřejně, včetně kompilátoru postaveného nad LLVM. Existují oficiální distribuce pro Linux a Windows, serverové frameworky (Vapor, Hummingbird) a balíčkovací nástroj Swift Package Manager. V praxi ale zůstává těžiště na Apple platformách, protože největší hodnotou jsou nativní frameworky SwiftUI a UIKit. Pro nativní aplikaci na iPhone je Swift dnes výchozí volba.

SwiftUI versus UIKit

SwiftUI je deklarativní framework, kde popíšete, jak má obrazovka vypadat pro daný stav, a systém dopočítá změny. UIKit je starší imperativní vrstva, kde se pohledy vytvářejí a upravují ručně. Nové projekty obvykle startují v SwiftUI, rozsáhlé existující aplikace kombinují obojí. Pozor na terminologii: Swift je jazyk, SwiftUI je knihovna napsaná v Swiftu, nejsou to zaměnitelné pojmy.

Příklady z praxe

  1. Bezpečné čtení chybějící hodnoty

    Aplikace čte uživatelské jméno z odpovědi API, kde pole může chybět. Ve Swiftu má hodnota typ String? a kompilátor nedovolí ji použít přímo. Konstrukce guard let ukončí funkci hned na začátku, když jméno chybí, takže zbytek kódu pracuje s jistou hodnotou.

    struct Profile: Decodable {
        let name: String?
    }
    
    func greeting(for profile: Profile) -> String {
        guard let name = profile.name, !name.isEmpty else {
            return "Vítejte"
        }
        return "Vítejte, \(name)"
    }
  2. Stahování dat přes async/await

    Starší kód stahoval JSON přes completion handler a chyby se předávaly druhým parametrem. S async/await se volání zapíše lineárně a chyby se propagují běžným throws. Volající metodu spustí z Tasku nebo z jiné async funkce.

    func loadOrders() async throws -> [Order] {
        let url = URL(string: "https://api.example.com/orders")!
        let (data, _) = try await URLSession.shared.data(from: url)
        return try JSONDecoder().decode([Order].self, from: data)
    }

Časté omyly

MýtusSwift funguje jenom na Macu a v Apple ekosystému.
Ve skutečnostiSwift je open source projekt s oficiálními sestaveními pro Linux i Windows a používá se i na serveru. Omezení není v jazyce, ale ve frameworcích: SwiftUI, UIKit a další Apple knihovny jinde nejsou dostupné.
MýtusSwift má garbage collector, takže se o paměť nemusím starat.
Ve skutečnostiSwift používá ARC, tedy automatické počítání referencí vkládané kompilátorem. Retain cykly ARC nerozpozná, proto je u delegátů a closures potřeba explicitní weak nebo unowned reference.
MýtusSwift a SwiftUI jsou totéž.
Ve skutečnostiSwift je programovací jazyk, SwiftUI je jeden z frameworků pro tvorbu uživatelského rozhraní napsaný v tomto jazyce. V Swiftu lze psát aplikace i v UIKitu, AppKitu nebo serverové služby bez jakéhokoli UI.

Časté dotazy

Vyplatí se ještě učit Objective-C, když existuje Swift?
Objective-C se vyplatí znát pasivně, ne jako hlavní jazyk. Nové projekty a naprostá většina dokumentace i výukových materiálů dnes používají Swift. Objective-C ale stále drží velké části starších kodebází, některé nízkoúrovňové knihovny a část systémových API se v něm historicky popisuje. Vývojář, který nastoupí do zavedené iOS aplikace, narazí na smíšený projekt a měl by umět přečíst hlavičky, pochopit posílání zpráv a rozumět bridgingu mezi oběma jazyky. Psát nový kód v Objective-C už ale prakticky není důvod.
Jak dlouho trvá naučit se Swift pro první iOS aplikaci?
Swift zvládne programátor se zkušeností z jiného jazyka natolik, aby postavil jednoduchou aplikaci, zhruba za několik týdnů. Syntaxe je čitelná a připomíná moderní jazyky jako Kotlin nebo TypeScript. Časově náročnější než jazyk samotný bývá ekosystém: životní cyklus aplikace, SwiftUI nebo UIKit, práce s Xcode, podepisování buildů a pravidla App Store. Úplný začátečník bez předchozí zkušenosti s programováním potřebuje spíš měsíce, protože se současně učí základní koncepty typů, funkcí a asynchronního kódu.
Potřebuji Mac, abych mohl programovat ve Swiftu?
Mac je nutný pro vývoj aplikací na iOS a macOS, protože Xcode a Apple SDK běží pouze na macOS a finální build pro App Store musí projít přes ně. Samotný jazyk Swift ale Mac nevyžaduje: existují oficiální toolchainy pro Linux a Windows a serverové projekty se běžně vyvíjejí ve VS Code. Pro učení jazyka lze využít i online prostředí. Jakmile ale přijde na řadu simulátor iPhonu, podepisování a odesílání aplikace, Macu se nevyhnete.
Je Swift rychlý ve srovnání s C nebo C++?
Swift se kompiluje do nativního strojového kódu přes LLVM, takže se výkonem pohybuje v řádu podobném C++, ne interpretovaným jazykům. Rozdíly vznikají v detailech: ARC přidává režii při práci s referenčními typy, dynamické dispatch u tříd stojí víc než přímé volání a kopírování hodnotových typů může být nákladné, pokud se s nimi zachází neopatrně. Pro drtivou většinu aplikací je výkon dostatečný a úzkým hrdlem bývá síť nebo vykreslování, nikoli jazyk.

Zdroje

  1. Swift (programming language)(otevře se v novém okně)Wikipedia
  2. Swift(otevře se v novém okně)Wikidata
  3. Objective-C (programming language)(otevře se v novém okně)Wikipedia
  4. LLVM(otevře se v novém okně)Wikipedia

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.