Junior
Čo je potrebné urobiť, aby sa štruktúra alebo trieda používateľa stali kľúčom v slovníku?
sobes.tech AI
Odpoveď od AI
Štruktúry alebo triedy musia byť hashovateľné. Pre štruktúru alebo triedu, ktorá obsahuje iba hashovateľné typy (napríklad Int, String, Bool), prekladateľ automaticky vygeneruje implementáciu protokolu Hashable. Ak štruktúra alebo trieda obsahuje ne-hashovateľné typy alebo vyžaduje špeciálnu logiku hashovania:
- Implementovať protokol
Hashable. - V metóde
hash(into:)pridať hashovateľné komponenty inštancie do poskytnutého hashera.
struct User: Hashable {
let id: UUID // UUID je predvolene hashovateľný
let name: String // String je predvolene hashovateľný
// Automaticky generované, ak všetky vlastnosti sú hashovateľné
// 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
}
// Ručná implementácia pre triedu
func hash(into hasher: inout Hasher) {
hasher.combine(difficulty)
hasher.combine(volume)
}
// Taktiež je potrebné implementovať `Equatable`
static func == (lhs: Settings, rhs: Settings) -> Bool {
lhs.difficulty == rhs.difficulty && lhs.volume == rhs.volume
}
}
// Príklad použitia
let users: [User: String] = [User(id: UUID(), name: "Alice"): "Manager"]
let gameSettings: [Settings: Bool] = [Settings(difficulty: 5, volume: 0.8): true]
Je tiež potrebné implementovať protokol Equatable, pretože Hashable dedí od neho. Kompilátor automaticky generuje implementáciu Equatable pre štruktúry, ktorých vlastnosti sú tiež Equatable. Pre triedy alebo štruktúry s vlastnosťami, ktoré nie sú Equatable (alebo pre špeciálnu logiku porovnania), je potrebná ručná implementácia ==.