Sobes.tech
Junior

Co je třeba udělat, aby se struktura nebo třída uživatele stala klíčem ve slovníku?

sobes.tech AI

Odpověď od AI

Struktury nebo třídy musí být hashovatelné. Pro strukturu nebo třídu obsahující pouze hashovatelné typy (například Int, String, Bool) generuje překladač automaticky implementaci protokolu Hashable. Pokud struktura nebo třída obsahuje ne-hashovatelné typy nebo vyžaduje speciální logiku hashování:

  1. Implementujte protokol Hashable.
  2. V metodě hash(into:) přidejte hashovatelné složky instance do poskytnutého hasheru.
struct User: Hashable {
    let id: UUID // UUID je výchozí hashovatelný
    let name: String // String je výchozí hashovatelný

    // Automaticky generováno, pokud všechny vlastnosti jsou hashovatelné
    // 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
    }

    // Ruční implementace pro třídu
    func hash(into hasher: inout Hasher) {
        hasher.combine(difficulty)
        hasher.combine(volume)
    }

    // Také je třeba implementovat `Equatable`
    static func == (lhs: Settings, rhs: Settings) -> Bool {
        lhs.difficulty == rhs.difficulty && lhs.volume == rhs.volume
    }
}

// Příklad použití
let users: [User: String] = [User(id: UUID(), name: "Alice"): "Manager"]
let gameSettings: [Settings: Bool] = [Settings(difficulty: 5, volume: 0.8): true]

Je také nutné implementovat protokol Equatable, protože Hashable dědí od něj. Kompilátor automaticky generuje implementaci Equatable pro struktury, jejichž vlastnosti jsou také Equatable. U tříd nebo struktur s vlastnostmi, které nejsou Equatable (nebo pro speciální logiku porovnání), je vyžadována ruční implementace ==.