Sobes.tech
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:

  1. Das Hashable-Protokoll implementiert werden.
  2. 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.