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:
- įgyvendinti
Hashableprotokolą. 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ą.