Junior
Was muss getan werden, damit die Struktur oder Klasse des Benutzers zum Schlüssel in einem Wörterbuch wird?
sobes.tech KI
Antwort von AI
Strukturen oder Klassen müssen hashbar sein. Für eine Struktur oder Klasse, die nur hashbare Typen enthält (z.B. Int, String, Bool), generiert der Compiler automatisch die Implementierung des Protokolls Hashable. Wenn die Struktur oder Klasse nicht-hashbare Typen enthält oder spezielle Hash-Logik erfordert, muss:
- Das
Hashable-Protokoll implementiert werden. - In der Methode
hash(into:)die hashbaren Komponenten der Instanz zum bereitgestellten Hasher hinzugefügt werden.
struct User: Hashable {
let id: UUID // UUID ist standardmäßig hashbar
let name: String // String ist standardmäßig hashbar
// Wird automatisch generiert, wenn alle Eigenschaften hashbar sind
// 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
}
// Manuelle Implementierung für die Klasse
func hash(into hasher: inout Hasher) {
hasher.combine(difficulty)
hasher.combine(volume)
}
// Es ist auch eine Implementierung von Equatable erforderlich
static func == (lhs: Settings, rhs: Settings) -> Bool {
lhs.difficulty == rhs.difficulty && lhs.volume == rhs.volume
}
}
// Beispiel für die Verwendung
let users: [User: String] = [User(id: UUID(), name: "Alice"): "Manager"]
let gameSettings: [Settings: Bool] = [Settings(difficulty: 5, volume: 0.8): true]
Es ist auch notwendig, das Protokoll Equatable zu implementieren, da Hashable von Equatable erbt. Der Compiler generiert automatisch die Implementierung von Equatable für Strukturen, deren Eigenschaften ebenfalls Equatable sind. Für Klassen oder Strukturen mit nicht-Equatable Eigenschaften (oder für spezielle Vergleichslogik) ist eine manuelle Implementierung von == erforderlich.