Associated Values — mechanismus Swift, který umožňuje připojit libovolná data ke každé variantě enum individuálně. Na rozdíl od raw values, kde všechny case mají hodnoty stejného typu, associated values se mohou lišit typem a množstvím pro každý case. Podle Apple Documentation, 2026 je to klíčová schopnost pro přesné modelování domény bez vytváření dalších typů obalů.
Hlavní body
Associated Values — jsou dodatečné informace, které case enum může ukládat spolu se sebou. Na rozdíl od raw values, které jsou pevně stanoveny na úrovni deklarace, associated values jsou určeny při vytváření instance enum.
Představte si modelování způsobu platby: case creditCard může ukládat poslední 4 číslice a datum expirace, a case applePay — nic. S associated values je to implementováno přirozeně, bez podtříd nebo volitelných polí.
Podle dokumentace Apple associated values transformují enum z jednoduché sady konstant na algebraický datový typ (sum type), charakteristický pro funkcionální jazyky. To výrazně zvyšuje expresivitu kódu.
Associated values se deklarují v závorkách za case, s uvedením názvů a typů parametrů, jako u funkcí.
enum MediaFile {
case image(width: Int, height: Int, format: String)
case video(duration: Double, codec: String)
case audio(bitrate: Int)
case unknown
}
Při vytváření instance se associated values předávají jako argumenty:
let photo = MediaFile.image(width: 1920, height: 1080, format: "jpeg")
let clip = MediaFile.video(duration: 120.5, codec: "h264")
Swift neukládá omezení na počet nebo typy associated values. Můžete použít generika, uzávěry a další enum uvnitř associated values. To umožňuje vytvářet složité vnořené struktury.
Názvy parametrů associated values se používají jako štítky argumentů při vytváření instance — to zlepšuje čitelnost kódu. Při extrakci přes switch slouží názvy jako dokumentace, vysvětlující význam každé hodnoty. Tento přístup činí kód samodokumentujícím a snižuje pravděpodobnost chyb při porovnávání dat. To je obzvláště cenné při týmovém vývoji velkých iOS aplikací.
Switch — hlavní způsob extrakce associated values. Hodnoty se vážou ke konstantám nebo proměnným přes let nebo var.
func describe(_ file: MediaFile) -> String {
switch file {
case .image(let w, let h, let fmt):
return "Image \(w)x\(h) .\(fmt)"
case .video(let duration, let codec):
return "Video \(duration)s, \(codec)"
case .audio(let bitrate):
return "Audio \(bitrate)kbps"
case .unknown:
return "Unknown format"
}
}
Swift podporuje částečné porovnávání — lze zadat konkrétní hodnoty associated values:
switch file {
case .image(let w, let h, "png"):
print("Obrázek PNG \(w)x\(h)")
case .image(1920, 1080, _):
print("Obrázek Full HD")
default:
break
}
Použití wildcard (_) umožňuje ignorovat nepotřebné associated values a konstanty v case — kontrolovat shodu s konkrétními hodnotami.
Mnoho začínajících vývojářů zaměňuje associated values s raw values. Jsou to různé mechanismy s různými scénáři použití.
| Charakteristika | Raw Values | Associated Values |
|---|---|---|
| Datový typ | Jeden typ pro všechny case | Různé typy pro každý case |
| Okamžik určení | Při deklaraci enum | Při vytváření instance |
| Povinnost | Všechny case mají hodnotu | Některé case mohou být bez hodnoty |
| Kompatibilita | Vzájemně se vylučují — nelze použít současně | |
Podle Swift Evolution byly associated values zavedeny ve Swift 2.0 jako součást přepracování enum. Poskytují algebraický přístup k typům, kde každý case je samostatný konstruktor s vlastním podpisem.
Associated values se aktivně používají v reálných iOS projektech. Podívejme se na tři typické scénáře.
enum APIResponse<T: Codable> {
case success(data: T, cached: Bool)
case failure(error: Error, retryAvailable: Bool)
case loading(progress: Double)
}
enum ViewState<T> {
case idle
case loading(message: String)
case loaded(data: T)
case error(message: String, retryAction: () -> Void)
}
S associated values se enum stává mocným nástrojem pro konečné automaty: každý case — stav, associated values — parametry tohoto stavu. Kompilátor zaručuje, že všechny přechody jsou zpracovány.
Pro kontrolu jednoho case bez switch použijte if case nebo guard case. Je to kompaktnější, když je třeba zpracovat pouze jednu variantu.
let error = NetworkError.timeout(seconds: 30)
if case .timeout(let seconds) = error {
print("Požadavek vypršel po \(seconds)s")
}
guard case .httpError(let code, _) = error else {
return
}
print("HTTP chyba s kódem \(code)")
Často kladené otázky
Ano, case může nemít associated values — například case unknown. Takové case se chovají jako běžné case enum bez dalších dat. Je to vhodné pro stavové značky.
Swift negeneruje Equatable automaticky pro enum s associated values (do Swift 4.2+). Přidejte explicitní implementaci Equatable nebo použijte switch pro srovnání každého case zvlášť.
Ano, associated values v indirect enum — standardní technika pro vytváření stromů a propojených seznamů. Case může obsahovat associated value stejného typu s označením indirect.
Associated values jsou typově bezpečné — každý case má zaručeně pouze svá data. Ve struct s volitelnostmi každá instance obsahuje všechna pole a jsou nutné runtime kontroly na nil.
Swift negeneruje Codable automaticky pro enum s associated values. Je nutná ruční implementace encode a decode přes switch na case s použitím custom coding keys.
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é