Sobes.tech
Junior

Ką reikia padaryti, kad naudotojo struktūra ar klasė taptų žodyno raktu?

sobes.tech AI

Atsakymas iš AI

Struktūra arba klasė turi būti hash'able. Jei struktūra arba klasė turi tik hash'able tipus (pavyzdžiui, Int, String, Bool), kompiliatorius automatiškai generuoja Hashable protokolo įgyvendinimą. Jei struktūra arba klasė turi ne-hash'able tipus arba reikalauja specialios hash'avimo logikos, būtina:

  1. įgyvendinti Hashable protokolą.
  2. hash(into:) metode pridėti objekto hash'able komponentus į pateiktą hasherį.
struct User: Hashable {
    let id: UUID // UUID automatiškai turi Hashable
    let name: String // String automatiškai turi Hashable

    // Automatiškai generuojama, jei visi savybės yra Hashable
    // 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
    }

    // Rankinis įgyvendinimas klasių atveju
    func hash(into hasher: inout Hasher) {
        hasher.combine(difficulty)
        hasher.combine(volume)
    }

    // Taip pat reikalinga `Equatable` įgyvendinimas `Hashable`
    static func == (lhs: Settings, rhs: Settings) -> Bool {
        lhs.difficulty == rhs.difficulty && lhs.volume == rhs.volume
    }
}

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

Taip pat būtina įgyvendinti Equatable protokolą, nes Hashable paveldi Equatable. Kompiliatorius automatiškai generuoja Equatable įgyvendinimą struktūroms, jei jų savybės taip pat Equatable. Klasių arba struktūrų, turinčių ne-Equatable savybių arba reikalaujančių specialios lyginimo logikos, atveju, būtina rankiniu būdu įgyvendinti == metodą.