Associated Values — un meccanismo di Swift che consente di associare dati arbitrari a ogni caso di enum individualmente. A differenza dei raw values, dove tutti i casi hanno valori dello stesso tipo, gli associated values possono differire per tipo e quantità per ogni caso. Secondo Apple Documentation, 2026, questa è una capacità chiave per modellare con precisione un dominio senza creare tipi wrapper aggiuntivi.
Punti Chiave
Associated Values sono informazioni aggiuntive che un caso di enum può memorizzare con sé. A differenza dei raw values, che sono fissi a livello di dichiarazione, gli associated values vengono impostati quando si crea un'istanza di enum.
Immagina di modellare un metodo di pagamento: il caso creditCard può memorizzare le ultime 4 cifre e la data di scadenza, mentre il caso applePay non memorizza nulla. Con gli associated values, questo viene implementato naturalmente, senza sottoclassi o campi opzionali.
Secondo la documentazione Apple, gli associated values trasformano un enum da un semplice insieme di costanti in un tipo di dato algebrico (sum type), caratteristico dei linguaggi funzionali. Ciò aumenta significativamente l'espressività del codice.
Gli Associated Values vengono dichiarati tra parentesi dopo il caso, specificando nomi e tipi dei parametri, come nelle funzioni.
enum MediaFile {
case image(width: Int, height: Int, format: String)
case video(duration: Double, codec: String)
case audio(bitrate: Int)
case unknown
}
Quando si crea un'istanza, gli associated values vengono passati come argomenti:
let photo = MediaFile.image(width: 1920, height: 1080, format: "jpeg")
let clip = MediaFile.video(duration: 120.5, codec: "h264")
Swift non impone restrizioni sul numero o sui tipi di associated values. Puoi usare generics, funzioni di chiusura e altri enum all'interno degli associated values. Ciò consente di costruire strutture nidificate complesse.
I nomi dei parametri degli associated values vengono usati come etichette degli argomenti quando si crea un'istanza — questo migliora la leggibilità del codice. Durante l'estrazione tramite switch, i nomi servono come documentazione, chiarendo il significato di ogni valore. Questo approccio rende il codice auto-documentante e riduce la probabilità di errori durante il matching dei dati. Ciò è particolarmente prezioso nello sviluppo di team di grandi applicazioni iOS.
Switch è il modo principale per estrarre gli associated values. I valori vengono legati a costanti o variabili tramite let o 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 supporta il matching parziale — puoi specificare valori concreti per gli associated values:
switch file {
case .image(let w, let h, "png"):
print("Immagine PNG \(w)x\(h)")
case .image(1920, 1080, _):
print("Immagine Full HD")
default:
break
}
Usare un wildcard (_) consente di ignorare associated values non necessari, e le costanti nei casi permettono di verificare corrispondenze con valori specifici.
Molti sviluppatori principianti confondono gli associated values con i raw values. Sono meccanismi diversi con casi d'uso diversi.
| Caratteristica | Raw Values | Associated Values |
|---|---|---|
| Tipo di Dato | Un tipo per tutti i casi | Tipi diversi per ogni caso |
| Momento di Assegnazione | Alla dichiarazione dell'enum | Alla creazione dell'istanza |
| Obbligatorietà | Tutti i casi hanno un valore | Alcuni casi possono essere senza valori |
| Compatibilità | Mutualmente esclusivi — non possono essere usati simultaneamente | |
Secondo Swift Evolution, gli associated values sono stati introdotti in Swift 2.0 come parte del redesign degli enum. Forniscono un approccio algebrico ai tipi, dove ogni caso è un costruttore separato con la propria firma.
Gli Associated Values sono attivamente utilizzati in progetti iOS reali. Consideriamo tre scenari tipici.
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)
}
Con gli associated values, l'enum diventa un potente strumento per le macchine a stati: ogni caso è uno stato, gli associated values sono i parametri di quello stato. Il compilatore garantisce che tutte le transizioni siano gestite.
Per verificare un singolo caso senza switch, usa if case o guard case. È più compatto quando devi gestire una sola opzione.
let error = NetworkError.timeout(seconds: 30)
if case .timeout(let seconds) = error {
print("Richiesta scaduta dopo \(seconds)s")
}
guard case .httpError(let code, _) = error else {
return
}
print("Errore HTTP con codice \(code)")
Domande Frequenti
Sì, un caso può non avere associated values — ad esempio, case unknown. Questi casi si comportano come normali casi di enum senza dati aggiuntivi. È comodo per stati marker.
Swift non genera automaticamente Equatable per enum con associated values (prima di Swift 4.2+). Aggiungi un'implementazione esplicita di Equatable o usa switch per confrontare ogni caso sequenzialmente.
Sì, gli associated values negli indirect enum sono una tecnica standard per costruire alberi e liste concatenate. Un caso può contenere un associated value dello stesso tipo marcato con indirect.
Associated Values sono type-safe — ogni caso garantisce di avere solo i propri dati. In una struct con opzionali, ogni istanza contiene tutti i campi e sono necessari controlli nil a runtime.
Swift non genera automaticamente Codable per enum con associated values. È necessaria un'implementazione manuale di encode e decode tramite switch sui casi usando chiavi di codifica personalizzate.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche