Junior
Co je třeba udělat, aby se struktura nebo třída uživatele stala klíčem ve slovníku?
sobes.tech AI
Odpověď od AI
Struktury nebo třídy musí být hashovatelné. Pro strukturu nebo třídu obsahující pouze hashovatelné typy (například Int, String, Bool) generuje překladač automaticky implementaci protokolu Hashable. Pokud struktura nebo třída obsahuje ne-hashovatelné typy nebo vyžaduje speciální logiku hashování:
- Implementujte protokol
Hashable. - V metodě
hash(into:)přidejte hashovatelné složky instance do poskytnutého hasheru.
struct User: Hashable {
let id: UUID // UUID je výchozí hashovatelný
let name: String // String je výchozí hashovatelný
// Automaticky generováno, pokud všechny vlastnosti jsou hashovatelné
// 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í implementace pro třídu
func hash(into hasher: inout Hasher) {
hasher.combine(difficulty)
hasher.combine(volume)
}
// Také je třeba implementovat `Equatable`
static func == (lhs: Settings, rhs: Settings) -> Bool {
lhs.difficulty == rhs.difficulty && lhs.volume == rhs.volume
}
}
// Příklad použití
let users: [User: String] = [User(id: UUID(), name: "Alice"): "Manager"]
let gameSettings: [Settings: Bool] = [Settings(difficulty: 5, volume: 0.8): true]
Je také nutné implementovat protokol Equatable, protože Hashable dědí od něj. Kompilátor automaticky generuje implementaci Equatable pro struktury, jejichž vlastnosti jsou také Equatable. U tříd nebo struktur s vlastnostmi, které nejsou Equatable (nebo pro speciální logiku porovnání), je vyžadována ruční implementace ==.