Associated Values ve Swift: co to je, syntaxe a příklady

Autor: IT Sectr Publikováno: 2026-06-17 Doba čtení: 6 min

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 — individuální data připojená k case enum
  • Typy associated values se mohou lišit pro každý case
  • Extrakce probíhá přes vázání hodnot v switch nebo if case
  • Vzájemné vyloučení — associated values jsou nekompatibilní s raw values
  • Praxe — modelování chyb, výsledků dotazů a stavů UI

Co jsou Associated Values?

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.

Syntaxe associated values

Associated values se deklarují v závorkách za case, s uvedením názvů a typů parametrů, jako u funkcí.

swift
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:

swift
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 s associated values

Switch — hlavní způsob extrakce associated values. Hodnoty se vážou ke konstantám nebo proměnným přes let nebo var.

swift
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:

swift
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.

Associated Values vs Raw Values

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í.

CharakteristikaRaw ValuesAssociated Values
Datový typJeden typ pro všechny caseRůzné typy pro každý case
Okamžik určeníPři deklaraci enumPři vytváření instance
PovinnostVšechny case mají hodnotuNěkteré case mohou být bez hodnoty
KompatibilitaVzá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.

Praktické příklady associated values

Associated values se aktivně používají v reálných iOS projektech. Podívejme se na tři typické scénáře.

Modelování API odpovědí

swift
enum APIResponse<T: Codable> {
    case success(data: T, cached: Bool)
    case failure(error: Error, retryAvailable: Bool)
    case loading(progress: Double)
}

UI State Machine

swift
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.

Extrakce přes if case a guard case

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.

swift
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

Může mít enum associated values bez parametrů?

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.

Jak porovnat dva enum s associated values?

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ášť.

Lze použít associated values v rekurzivních enum?

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.

Čím se associated values liší od volitelných vlastností ve struct?

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.

Podporují associated values Codable?

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í

  • Associated Values — mechanismus pro připojení různých dat ke každému case enum
  • Syntaxe — deklarace parametrů v závorkách za case, jako u funkcí
  • Extrakce přes switch s let-vázáním nebo if case
  • Nekompatibilní s raw values — použijte jedno z nich
  • Generika v associated values dělají z enum univerzální kontejner
  • State Machine — typický scénář pro associated values v iOS

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í.

Prodiskutovat projekt

Přečtěte si také