Associated Values în Swift: ce este, sintaxă și exemple

Autor: IT Sectr Publicat: 2026-06-17 Timp de citire: 6 min

Associated Values — mecanismul Swift care permite atașarea de date arbitrare la fiecare variantă de enum individual. Spre deosebire de raw values, unde toate case-urile au valori de același tip, associated values pot diferi ca tip și cantitate pentru fiecare case. Conform Apple Documentation, 2026, aceasta este o capacitate cheie pentru modelarea precisă a domeniului fără a crea tipuri wrapper suplimentare.

Principalele puncte

  • Associated Values — date individuale atașate unui case enum
  • Tipurile associated values pot diferi pentru fiecare case
  • Extragerea are loc prin legarea valorilor în switch sau if case
  • Excludere reciprocă — associated values sunt incompatibile cu raw values
  • Practică — modelarea erorilor, rezultatelor cererilor și stărilor UI

Ce sunt Associated Values?

Associated Values — sunt informații suplimentare pe care un case enum le poate stoca împreună cu sine. Spre deosebire de raw values, care sunt fixate la nivelul declarației, associated values sunt stabilite la crearea instanței enum.

Imaginați-vă modelarea unei metode de plată: case-ul creditCard poate stoca ultimele 4 cifre și data expirării, iar case-ul applePay — nimic. Cu associated values acest lucru se implementează natural, fără subclase sau câmpuri opționale.

Conform documentației Apple, associated values transformă enum dintr-un set simplu de constante într-un tip de date algebric (sum type), caracteristic limbajelor funcționale. Acest lucru crește semnificativ expresivitatea codului.

Sintaxa associated values

Associated values sunt declarate în paranteze rotunde după case, cu indicarea numelor și tipurilor parametrilor, ca la funcții.

swift
enum MediaFile {
    case image(width: Int, height: Int, format: String)
    case video(duration: Double, codec: String)
    case audio(bitrate: Int)
    case unknown
}

La crearea instanței, associated values sunt transmise ca argumente:

swift
let photo = MediaFile.image(width: 1920, height: 1080, format: "jpeg")
let clip = MediaFile.video(duration: 120.5, codec: "h264")

Swift nu impune restricții asupra numărului sau tipurilor de associated values. Puteți folosi generice, funcții closure și alte enum-uri în interiorul associated values. Acest lucru face posibilă construirea de structuri imbricate complexe.

Numele parametrilor associated values sunt folosite ca etichete de argumente la crearea instanței — acest lucru îmbunătățește lizibilitatea codului. La extragerea prin switch, numele servesc ca documentație, explicând semnificația fiecărei valori. O astfel de abordare face codul autodocumentat și reduce probabilitatea erorilor la potrivirea datelor. Acest lucru este deosebit de valoros în dezvoltarea în echipă a aplicațiilor iOS mari.

Switch cu associated values

Switch — modul principal de extragere a associated values. Valorile sunt legate la constante sau variabile prin let sau 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 suportă potrivirea parțială — se pot specifica valori concrete ale associated values:

swift
switch file {
case .image(let w, let h, "png"):
    print("Imagine PNG \(w)x\(h)")
case .image(1920, 1080, _):
    print("Imagine Full HD")
default:
    break
}

Utilizarea wildcard (_) permite ignorarea associated values inutile, iar constantele în case-uri — verificarea coincidenței cu valori specifice.

Associated Values vs Raw Values

Mulți dezvoltatori începători confundă associated values cu raw values. Sunt mecanisme diferite cu scenarii de aplicare diferite.

CaracteristicăRaw ValuesAssociated Values
Tipul de dateUn tip pentru toate case-urileTipuri diferite pentru fiecare case
Momentul stabiliriiLa declararea enumLa crearea instanței
ObligativitateaToate case-urile au valoareUnele case-uri pot fi fără valori
CompatibilitateaSe exclud reciproc — nu pot fi folosite simultan

Conform Swift Evolution, associated values au fost introduse în Swift 2.0 ca parte a reproiectării enum. Ele asigură o abordare algebrică a tipurilor, unde fiecare case este un constructor separat cu propria semnătură.

Exemple practice de associated values

Associated values sunt utilizate activ în proiecte iOS reale. Să examinăm trei scenarii tipice.

Modelarea răspunsurilor API

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

Mașina de stări UI

swift
enum ViewState<T> {
    case idle
    case loading(message: String)
    case loaded(data: T)
    case error(message: String, retryAction: () -> Void)
}

Cu associated values, enum devine un instrument puternic pentru mașini cu stări finite: fiecare case — o stare, associated values — parametrii acelei stări. Compilatorul garantează că toate tranzițiile sunt procesate.

Extragerea prin if case și guard case

Pentru verificarea unui singur case fără switch utilizați if case sau guard case. Este mai compact când trebuie procesată doar o variantă.

swift
let error = NetworkError.timeout(seconds: 30)

if case .timeout(let seconds) = error {
    print("Cererea a expirat după \(seconds)s")
}

guard case .httpError(let code, _) = error else {
    return
}
print("Eroare HTTP cu codul \(code)")

Întrebări frecvente

Poate un enum să aibă associated values fără parametri?

Da, un case poate să nu aibă associated values — de exemplu, case unknown. Astfel de case-uri se comportă ca case-uri obișnuite de enum fără date suplimentare. Este convenabil pentru stări de marcare.

Cum se compară două enum-uri cu associated values?

Swift nu generează Equatable automat pentru enum-uri cu associated values (până la Swift 4.2+). Adăugați o implementare explicită Equatable sau utilizați switch pentru compararea fiecărui case pe rând.

Pot fi folosite associated values în enum-uri recursive?

Da, associated values în indirect enum — o tehnică standard pentru construirea de arbori și liste înlănțuite. Un case poate conține o associated value de același tip cu marca indirect.

Cu ce diferă associated values de proprietățile opționale din struct?

Associated values sunt tip-sigure — fiecare case are garantat doar datele sale. În struct cu opționale, orice instanță conține toate câmpurile și sunt necesare verificări runtime pentru nil.

Suportă associated values Codable?

Swift nu generează Codable automat pentru enum-uri cu associated values. Este necesară implementarea manuală a encode și decode prin switch pe case-uri cu utilizarea de custom coding keys.

Rezumat

  • Associated Values — mecanism de atașare a diferitelor date la fiecare case enum
  • Sintaxa — declararea parametrilor în paranteze după case, ca la funcții
  • Extragerea prin switch cu let-binding sau if case
  • Incompatibile cu raw values — folosiți una dintre ele
  • Genericele în associated values fac enum-ul un container universal
  • State Machine — scenariu tipic pentru associated values în iOS

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și