Que faut-il faire pour que la structure ou la classe utilisateur devienne une clé dans un dictionnaire?
sobes.tech IA
Réponse de l'IA
Les structures ou classes doivent être hashables. Pour une structure ou classe contenant uniquement des types hashables (par exemple, Int, String, Bool), le compilateur génère automatiquement l'implémentation du protocole Hashable. Si la structure ou classe contient des types non hashables ou nécessite une logique de hachage spécifique, il faut :
- Implémenter le protocole
Hashable. - Dans la méthode
hash(into:), ajouter les composants hashables de l'instance au hasher fourni.
struct User: Hashable {
let id: UUID // UUID est Hashable par défaut
let name: String // String est Hashable par défaut
// Généré automatiquement si toutes les propriétés sont Hashable
// func hash(into hasher: inout Hasher) {
// hasher.combine(id)
// hasher.combine(name)
// }
}
class Settings: Hashable {
var difficulty: Int
var volume: Float
init(difficulty: Int, volume: Float) {
self.difficulty = difficulty
self.volume = volume
}
// Implémentation manuelle pour la classe
func hash(into hasher: inout Hasher) {
hasher.combine(difficulty)
hasher.combine(volume)
}
// Il faut aussi implémenter Equatable pour Hashable
static func == (lhs: Settings, rhs: Settings) -> Bool {
lhs.difficulty == rhs.difficulty && lhs.volume == rhs.volume
}
}
// Exemple d'utilisation
let users: [User: String] = [User(id: UUID(), name: "Alice"): "Manager"]
let gameSettings: [Settings: Bool] = [Settings(difficulty: 5, volume: 0.8): true]
Il est également nécessaire d'implémenter le protocole Equatable, car Hashable hérite de Equatable. Le compilateur génère automatiquement l'implémentation de Equatable pour les structures dont les propriétés sont également Equatable. Pour les classes ou structures avec des propriétés non Equatable (ou pour une logique de comparaison spécifique), une implémentation manuelle de == est requise.