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:
- Implementálni kell a
Hashableprotokollt. - 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.