Sobes.tech
Junior

Cosa bisogna fare affinché la struttura o la classe utente diventino una chiave in un dizionario?

sobes.tech AI

Risposta dell'AI

Le strutture o le classi devono essere hashabili. Per una struttura o classe che contiene solo tipi hashabili (ad esempio, Int, String, Bool), il compilatore genera automaticamente l'implementazione del protocollo Hashable. Se la struttura o classe contiene tipi non hashabili o richiede una logica di hash speciale, è necessario:

  1. Implementare il protocollo Hashable.
  2. Nel metodo hash(into:), aggiungere i componenti hashabili dell'istanza all'hashers fornito.
struct User: Hashable {
    let id: UUID // UUID è hashabile di default
    let name: String // String è hashabile di default

    // Viene generato automaticamente se tutte le proprietà sono hashabili
    // 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
    }

    // Implementazione manuale per la classe
    func hash(into hasher: inout Hasher) {
        hasher.combine(difficulty)
        hasher.combine(volume)
    }

    // È anche richiesta l'implementazione di `Equatable`
    static func == (lhs: Settings, rhs: Settings) -> Bool {
        lhs.difficulty == rhs.difficulty && lhs.volume == rhs.volume
    }
}

// Esempio di utilizzo
let users: [User: String] = [User(id: UUID(), name: "Alice"): "Manager"]
let gameSettings: [Settings: Bool] = [Settings(difficulty: 5, volume: 0.8): true]

È anche necessario implementare il protocollo Equatable, poiché Hashable eredita da Equatable. Il compilatore genera automaticamente l'implementazione di Equatable per strutture le cui proprietà sono anch'esse Equatable. Per classi o strutture con proprietà non Equatable (o per logiche di confronto personalizzate), è richiesta un'implementazione manuale di ==.