Associated Values — un mécanisme Swift permettant d'attacher des données arbitraires à chaque cas d'enum individuellement. Contrairement aux raw values, où tous les cas ont des valeurs du même type, les associated values peuvent différer en type et en quantité pour chaque cas. Selon Apple Documentation, 2026, c'est une capacité clé pour modéliser précisément un domaine sans créer de types wrapper supplémentaires.
Points Clés
Associated Values sont des informations supplémentaires qu'un cas d'enum peut stocker avec lui-même. Contrairement aux raw values, qui sont fixes au niveau de la déclaration, les associated values sont définies lors de la création d'une instance d'enum.
Imaginez la modélisation d'un moyen de paiement : le cas creditCard peut stocker les 4 derniers chiffres et la date d'expiration, tandis que le cas applePay ne stocke rien. Avec les associated values, cela s'implémente naturellement, sans sous-classes ni champs optionnels.
Selon la documentation Apple, les associated values transforment un enum d'un simple ensemble de constantes en un type de données algébrique (sum type), caractéristique des langages fonctionnels. Cela améliore considérablement l'expressivité du code.
Les Associated Values sont déclarées entre parenthèses après le cas, en spécifiant les noms et types de paramètres, comme pour les fonctions.
enum MediaFile {
case image(width: Int, height: Int, format: String)
case video(duration: Double, codec: String)
case audio(bitrate: Int)
case unknown
}
Lors de la création d'une instance, les associated values sont passées comme arguments :
let photo = MediaFile.image(width: 1920, height: 1080, format: "jpeg")
let clip = MediaFile.video(duration: 120.5, codec: "h264")
Swift n'impose pas de restrictions sur le nombre ou les types d'associated values. Vous pouvez utiliser des génériques, des fonctions de fermeture et d'autres enums à l'intérieur des associated values. Cela permet de construire des structures imbriquées complexes.
Les noms des paramètres d'associated values sont utilisés comme étiquettes d'arguments lors de la création d'une instance — cela améliore la lisibilité du code. Lors de l'extraction via switch, les noms servent de documentation, clarifiant la signification de chaque valeur. Cette approche rend le code auto-documenté et réduit la probabilité d'erreurs lors de la correspondance des données. C'est particulièrement précieux dans le développement en équipe de grandes applications iOS.
Switch est le moyen principal d'extraire les associated values. Les valeurs sont liées à des constantes ou variables via let ou 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 prend en charge la correspondance partielle — vous pouvez spécifier des valeurs concrètes pour les associated values :
switch file {
case .image(let w, let h, "png"):
print("Image PNG \(w)x\(h)")
case .image(1920, 1080, _):
print("Image Full HD")
default:
break
}
L'utilisation d'un joker (_) permet d'ignorer les associated values inutiles, et les constantes dans les cas permettent de vérifier la correspondance avec des valeurs spécifiques.
De nombreux développeurs débutants confondent les associated values avec les raw values. Ce sont des mécanismes différents avec des cas d'utilisation différents.
| Caractéristique | Raw Values | Associated Values |
|---|---|---|
| Type de données | Un type pour tous les cas | Types différents pour chaque cas |
| Moment d'attribution | À la déclaration de l'enum | À la création de l'instance |
| Obligatoire | Tous les cas ont une valeur | Certains cas peuvent être sans valeurs |
| Compatibilité | Mutuellement exclusifs — ne peuvent pas être utilisés simultanément | |
Selon Swift Evolution, les associated values ont été introduites dans Swift 2.0 dans le cadre de la refonte des enums. Elles fournissent une approche algébrique des types, où chaque cas est un constructeur séparé avec sa propre signature.
Les Associated Values sont activement utilisées dans les projets iOS réels. Considérons trois scénarios typiques.
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)
}
Avec les associated values, l'enum devient un outil puissant pour les machines d'état : chaque cas est un état, les associated values sont les paramètres de cet état. Le compilateur garantit que toutes les transitions sont traitées.
Pour vérifier un seul cas sans switch, utilisez if case ou guard case. C'est plus compact lorsque vous devez traiter une seule option.
let error = NetworkError.timeout(seconds: 30)
if case .timeout(let seconds) = error {
print("Requête expirée après \(seconds)s")
}
guard case .httpError(let code, _) = error else {
return
}
print("Erreur HTTP avec le code \(code)")
Questions Fréquentes
Oui, un cas peut ne pas avoir d'associated values — par exemple, case unknown. Ces cas se comportent comme des cas d'enum normaux sans données supplémentaires. C'est pratique pour les états marqueurs.
Swift ne génère pas automatiquement Equatable pour les enums avec associated values (avant Swift 4.2+). Ajoutez une implémentation explicite de Equatable ou utilisez switch pour comparer chaque cas séquentiellement.
Oui, les associated values dans les indirect enums sont une technique standard pour construire des arbres et des listes chaînées. Un cas peut contenir une associated value du même type marquée avec indirect.
Associated Values sont type-safe — chaque cas est garanti de n'avoir que ses propres données. Dans une struct avec des optionnels, chaque instance contient tous les champs, et des vérifications nil à l'exécution sont nécessaires.
Swift ne génère pas automatiquement Codable pour les enums avec associated values. Une implémentation manuelle de encode et decode via switch sur les cas avec des clés de codage personnalisées est nécessaire.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi