Enum ve Swiftu je typ, který spojuje skupinu souvisejících hodnot pod jedním názvem. Na rozdíl od C a Objective-C, kde je enum pouze sadou celočíselných konstant, Swift nabízí first-class výčty s associated values, raw values, metodami a podporou protokolů. Podle Apple, 2026 je enum jedním z klíčových nástrojů typově bezpečného modelování stavů ve vývoji iOS.
Hlavní body
Enum (výčet) — je uživatelsky definovaný datový typ, který spojuje konečnou sadu vzájemně se vylučujících variant. Ve Swiftu enum není jen numerické konstanty, ale plnohodnotný typ s vlastní logikou.
Každá varianta výčtu se nazývá případ. Na rozdíl od Objective-C, kde je enum redukován na celočíselný typ, Swift umožňuje každému případu ukládat vlastní data a mít metody.
Podle Apple enum ve Swiftu podporuje generika, inicializátory, vypočítávané vlastnosti a implementaci protokolů — to ho činí použitelným pro modelování stavů, chyb, možností a konečných automatů.
Používejte enum všude, kde potřebujete reprezentovat konečnou množinu vzájemně se vylučujících variant: stavy obrazovky, typy chyb, směry, možnosti filtrování.
Enum se deklaruje klíčovým slovem enum následovaným názvem a tělem ve složených závorkách.
enum CompassDirection {
case north
case south
case east
case west
}
Případy lze deklarovat na jednom řádku s čárkou:
enum Planet {
case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}
Pro přístup k případu se používá tečková notace za známým typem:
let direction = CompassDirection.north
// Typ je znám — zkrácená syntaxe je k dispozici:
var currentPlanet = .earth
Po přiřazení proměnné známého typu enum Swift automaticky odvodí typ a název výčtu lze při přístupu k případům vynechat.
Raw Values — jsou hodnoty stejného typu, které jsou přiřazeny každému případu enum. Na rozdíl od associated values jsou raw values typově stejné pro všechny případy a nastavují se při deklaraci.
enum HTTPStatusCode: Int {
case ok = 200
case notFound = 404
case internalServerError = 500
}
let code = HTTPStatusCode.notFound
print(code.rawValue) // 404
Pro celočíselné raw values Swift automaticky inkrementuje hodnoty, pokud je explicitně zadán pouze první:
enum Status: Int {
case pending = 1
case active // 2
case completed // 3
}
Raw values mohou být typů Int, String, Character nebo jakéhokoli typu vyhovujícího protokolu RawRepresentable. Swift automaticky generuje inicializátor init? pro vytvoření enum z raw value — to je užitečné při parsování dat z API.
Associated Values umožňují připojit různé datové typy ke každému případu výčtu jednotlivě. Na rozdíl od raw values se associated values mohou lišit typem i množstvím.
enum NetworkError {
case timeout(seconds: Int)
case httpError(code: Int, message: String)
case noConnection
case unknown(error: Error)
}
Při zpracování přes switch jsou associated values extrahovány vázáním na proměnné nebo konstanty:
let error = NetworkError.httpError(code: 403, message: "Forbidden")
switch error {
case .timeout(let seconds):
print("Časový limit po \(seconds)s")
case .httpError(let code, let message):
print("HTTP \(code): \(message)")
case .noConnection:
print("Žádné připojení")
case .unknown(let err):
print("Neznámý: \(err.localizedDescription)")
}
Podle dokumentace Apple dělají associated values z enumu expresivní nástroj pro modelování složitých stavů bez vytváření samostatných obalových typů. Používejte je pro scénáře podobné Result a modelování chyb s kontextem.
Rekurzivní enum — výčet, jehož případy odkazují na samotný typ enum. Takové případy se označují klíčovým slovem indirect.
indirect enum LinkedList<T> {
case empty
case node(value: T, next: LinkedList<T>)
}
Klíčové slovo indirect před enum označuje všechny případy jako rekurzivní. Alternativně lze označit indirect pouze konkrétní případ:
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
Swift používá indirect k ukládání rekurzivních případů jako referencí (reference semantics) místo hodnot — to zabraňuje nekonečné velikosti enum na zásobníku. Rekurzivní enumy jsou široce používány při vytváření stromů, lineárních seznamů a AST.
Enum může implementovat protokoly stejně jako struktury a třídy. To je klíčová schopnost protokolově orientovaného programování ve Swiftu.
protocol Describable {
var description: String { get }
}
enum PaymentMethod: Describable {
case creditCard(last4: String)
case applePay
case bankTransfer
var description: String {
switch self {
case .creditCard(let last4):
return "Card ending in \(last4)"
case .applePay:
return "Apple Pay"
case .bankTransfer:
return "Bank Transfer"
}
}
}
Enum také může implementovat Cocoa protokoly — například CaseIterable pro automatické generování kolekce všech případů nebo Codable pro serializaci. To činí z enumu univerzální stavební blok ve Swift aplikacích.
Často kladené otázky
Enum — je typ s konečnou sadou vzájemně se vylučujících variant, zatímco struct je typ s libovolnou sadou vlastností. Enum nemůže mít stored properties, ale podporuje computed properties a metody.
Ne, enum nemůže mít současně raw values i associated values. Raw values jsou hodnoty stejného typu pro všechny případy, associated values jsou individuální data pro každý případ. Tyto mechanismy se vzájemně vylučují.
Přidejte shodu s protokolem CaseIterable. Swift automaticky vygeneruje vlastnost allCases, která vrací kolekci všech případů v pořadí deklarace. To je vhodné pro iteraci přes všechny varianty.
Switch — je nejbezpečnější metoda, protože kompilátor kontroluje vyčerpávající pokrytí. Lze použít if case pro kontrolu jednoho případu nebo == pro enum bez associated values.
Ano, enum podporuje generika: enum Result<T, E> { case success(T); case failure(E) }. To umožňuje vytvářet typově bezpečné generické konstrukce pro zpracování úspěchu a chyby.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také