Sobes.tech
Junior

Wat moet er gedaan worden zodat de structuur of klasse van de gebruiker een sleutel in een woordenboek wordt?

sobes.tech AI

Antwoord van AI

Structuren of klassen moeten hashbaar zijn. Voor een structuur of klasse die alleen hashbare typen bevat (bijvoorbeeld Int, String, Bool), genereert de compiler automatisch de implementatie van het Hashable protocol. Als de structuur of klasse niet-hashbare typen bevat of speciale hash-logica vereist, moet:

  1. Het Hashable protocol worden geïmplementeerd.
  2. In de methode hash(into:), de hashbare componenten van de instantie worden toegevoegd aan de meegeleverde hasher.
struct User: Hashable {
    let id: UUID // UUID is standaard hashbaar
    let name: String // String is standaard hashbaar

    // Wordt automatisch gegenereerd als alle eigenschappen hashbaar zijn
    // 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
    }

    // Handmatige implementatie voor de klasse
    func hash(into hasher: inout Hasher) {
        hasher.combine(difficulty)
        hasher.combine(volume)
    }

    // Ook moet de `Equatable`-implementatie worden toegevoegd
    static func == (lhs: Settings, rhs: Settings) -> Bool {
        lhs.difficulty == rhs.difficulty && lhs.volume == rhs.volume
    }
}

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

Het is ook nodig om het Equatable-protocol te implementeren, omdat Hashable ervan erft. De compiler genereert automatisch de Equatable-implementatie voor structs waarvan de eigenschappen ook Equatable zijn. Voor klassen of structs met niet-Equatable eigenschappen (of voor aangepaste vergelijkingslogica) is een handmatige implementatie van == vereist.