Junior
Ko nepieciešams darīt, lai lietotāja struktūra vai klase kļūtu par vārdnīcas atslēgu?
sobes.tech AI
Atbilde no AI
Vai struktūra vai klase ir jābūt hashējama. Ja struktūra vai klase satur tikai hashējamas tipus (piemēram, Int, String, Bool), kompilators automātiski ģenerē Hashable protokola īstenojumu. Ja struktūra vai klase satur ne-hashējamas tipus vai prasa īpašu hashēšanas loģiku, ir nepieciešams:
- īstenot
Hashableprotokolu. hash(into:)metodē pievienot objekta hashējamos komponentus nodrošinātajam hasherim.
struct User: Hashable {
let id: UUID // UUID automātiski ir Hashable
let name: String // String automātiski ir Hashable
// Automātiski ģenerējas, ja visas īpašības ir 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
}
// Rokas īstenojums klases gadījumā
func hash(into hasher: inout Hasher) {
hasher.combine(difficulty)
hasher.combine(volume)
}
// Tāpat nepieciešama `Equatable` īstenošana `Hashable` dēļ
static func == (lhs: Settings, rhs: Settings) -> Bool {
lhs.difficulty == rhs.difficulty && lhs.volume == rhs.volume
}
}
// Piemērs izmantošanai
let users: [User: String] = [User(id: UUID(), name: "Alice"): "Manager"]
let gameSettings: [Settings: Bool] = [Settings(difficulty: 5, volume: 0.8): true]
Tāpat ir nepieciešams īstenot Equatable protokolu, jo Hashable manto Equatable. Kompilators ģenerē Equatable īstenojumu struktūrām, ja to īpašības ir arī Equatable. Klases vai struktūras ar ne-Equatable īpašībām vai ar īpašu salīdzināšanas loģiku prasa roku īstenošanu == metodē.