Sobes.tech
Junior

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 :

  1. Implémenter le protocole Hashable.
  2. 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.