Sobes.tech
Junior

Čo je potrebné urobiť, aby sa štruktúra alebo trieda používateľa stali kľúčom v slovníku?

sobes.tech AI

Odpoveď od AI

Štruktúry alebo triedy musia byť hashovateľné. Pre štruktúru alebo triedu, ktorá obsahuje iba hashovateľné typy (napríklad Int, String, Bool), prekladateľ automaticky vygeneruje implementáciu protokolu Hashable. Ak štruktúra alebo trieda obsahuje ne-hashovateľné typy alebo vyžaduje špeciálnu logiku hashovania:

  1. Implementovať protokol Hashable.
  2. V metóde hash(into:) pridať hashovateľné komponenty inštancie do poskytnutého hashera.
struct User: Hashable {
    let id: UUID // UUID je predvolene hashovateľný
    let name: String // String je predvolene hashovateľný

    // Automaticky generované, ak všetky vlastnosti sú hashovateľné
    // 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á implementácia pre triedu
    func hash(into hasher: inout Hasher) {
        hasher.combine(difficulty)
        hasher.combine(volume)
    }

    // Taktiež je potrebné implementovať `Equatable`
    static func == (lhs: Settings, rhs: Settings) -> Bool {
        lhs.difficulty == rhs.difficulty && lhs.volume == rhs.volume
    }
}

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

Je tiež potrebné implementovať protokol Equatable, pretože Hashable dedí od neho. Kompilátor automaticky generuje implementáciu Equatable pre štruktúry, ktorých vlastnosti sú tiež Equatable. Pre triedy alebo štruktúry s vlastnosťami, ktoré nie sú Equatable (alebo pre špeciálnu logiku porovnania), je potrebná ručná implementácia ==.