Sobes.tech
Junior

Mit kell tenni ahhoz, hogy a felhasználó szerkezete vagy osztálya kulcs legyen egy szótárban?

sobes.tech MI

Válasz az MI-től

A szerkezeteknek vagy osztályoknak hash-elhetőnek kell lenniük. Egy olyan szerkezet vagy osztály esetében, amely csak hash-elhető típusokat tartalmaz (például Int, String, Bool), a fordító automatikusan generálja a Hashable protokoll implementációját. Ha a szerkezet vagy osztály nem-hash-elhető típusokat tartalmaz, vagy speciális hash-elési logikát igényel, akkor:

  1. Implementálni kell a Hashable protokollt.
  2. A hash(into:) metódusban hozzá kell adni az példány hash-elhető komponenseit a megadott hasherhez.
struct User: Hashable {
    let id: UUID // A UUID alapértelmezés szerint hash-elhető
    let name: String // A String alapértelmezés szerint hash-elhető

    // Automatikusan generálódik, ha minden tulajdonság hash-elhető
    // 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
    }

    // Kézi megvalósítás osztály esetén
    func hash(into hasher: inout Hasher) {
        hasher.combine(difficulty)
        hasher.combine(volume)
    }

    // Szintén szükséges az `Equatable` megvalósítása
    static func == (lhs: Settings, rhs: Settings) -> Bool {
        lhs.difficulty == rhs.difficulty && lhs.volume == rhs.volume
    }
}

// Használati példa
let users: [User: String] = [User(id: UUID(), name: "Alice"): "Manager"]
let gameSettings: [Settings: Bool] = [Settings(difficulty: 5, volume: 0.8): true]

Szintén szükséges az Equatable protokoll megvalósítása, mivel a Hashable öröklődik az Equatable-től. A fordító automatikusan generálja az Equatable megvalósítást olyan struktúrákhoz, amelyek tulajdonságai szintén Equatable-ek. Nem-Equatable tulajdonságokat tartalmazó osztályok vagy struktúrák (vagy egyedi összehasonlítási logikával) esetén kézi == megvalósítás szükséges.