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:
- rakendada
Hashableprotokoll. 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.