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:
- Implementare il protocollo
Hashable. - 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 ==.