Sobes.tech
Junior

Mida tuleb teha, et kasutaja struktuur või klass muutuks sõnastiku võtme?

sobes.tech AI

Vastus AI-lt

Vorm või klass peab olema hash'itud. Kui vorm või klass sisaldab ainult hash'itavaid tüüpe (näiteks Int, String, Bool), genereerib kompilaator automaatselt Hashable protokolli rakenduse. Kui vorm või klass sisaldab mitte-hash'itavaid tüüpe või nõuab erilist hashimise loogikat, on vaja:

  1. rakendada Hashable protokoll.
  2. hash(into:) meetodis lisada vormi hash'itavad komponendid antud hasherile.
struktuur User: Hashable {
    let id: UUID // UUID on automaatselt Hashable
    let name: String // String on automaatselt Hashable

    // Automaatne genereerimine, kui kõik omadused on Hashable
    // func hash(into hasher: inout Hasher) {
    //     hasher.combine(id)
    //     hasher.combine(name)
    // }
}

klass Settings: Hashable {
    var difficulty: Int
    var volume: Float

    init(difficulty: Int, volume: Float) {
        self.difficulty = difficulty
        self.volume = volume
    }

    // Käsitsi rakendamine klassi jaoks
    func hash(into hasher: inout Hasher) {
        hasher.combine(difficulty)
        hasher.combine(volume)
    }

    // Samuti on vaja `Equatable` rakendust `Hashable` jaoks
    static func == (lhs: Settings, rhs: Settings) -> Bool {
        lhs.difficulty == rhs.difficulty && lhs.volume == rhs.volume
    }
}

// Näide kasutamisest
let users: [User: String] = [User(id: UUID(), name: "Alice"): "Manager"]
let gameSettings: [Settings: Bool] = [Settings(difficulty: 5, volume: 0.8): true]

Samuti on vaja rakendada Equatable protokoll, kuna Hashable pärib Equatable-i. Kompilator genereerib Equatable rakenduse struktuuridele, kui nende omadused on samuti Equatable. Klasside või struktuuride puhul, mille omadused ei ole Equatable või millel on eriline võrdlusloogika, on vaja käsitsi rakendada == meetod.