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 — 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.
Associated values sunt declarate în paranteze rotunde după case, cu indicarea numelor și tipurilor parametrilor, ca la funcții.
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:
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 — modul principal de extragere a associated values. Valorile sunt legate la constante sau variabile prin let sau 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 suportă potrivirea parțială — se pot specifica valori concrete ale associated values:
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.
Mulți dezvoltatori începători confundă associated values cu raw values. Sunt mecanisme diferite cu scenarii de aplicare diferite.
| Caracteristică | Raw Values | Associated Values |
|---|---|---|
| Tipul de date | Un tip pentru toate case-urile | Tipuri diferite pentru fiecare case |
| Momentul stabilirii | La declararea enum | La crearea instanței |
| Obligativitatea | Toate case-urile au valoare | Unele case-uri pot fi fără valori |
| Compatibilitatea | Se 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ă.
Associated values sunt utilizate activ în proiecte iOS reale. Să examinăm trei scenarii tipice.
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)
}
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.
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ă.
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
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.
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.
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.
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.
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
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.
Citiți și