Junior
Ce trebuie făcut pentru ca structura sau clasa utilizatorului să devină o cheie într-un dicționar?
sobes.tech AI
Răspuns de la AI
Structurile sau clasele trebuie să fie hash-abile. Pentru o structură sau clasă care conține doar tipuri hash-abile (de exemplu, Int, String, Bool), compilatorul generează automat implementarea protocolului Hashable. Dacă structura sau clasa conține tipuri non-hash-abile sau necesită logică specială de hash, este necesar:
- Să implementeze protocolul
Hashable. - În metoda
hash(into:), să adauge componentele hash-abile ale instanței în hasher-ul furnizat.
struct User: Hashable {
let id: UUID // UUID este hash-abil implicit
let name: String // String este hash-abil implicit
// Se generează automat dacă toate proprietățile sunt hash-abile
// 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
}
// Implementare manuală pentru clasă
func hash(into hasher: inout Hasher) {
hasher.combine(difficulty)
hasher.combine(volume)
}
// De asemenea, trebuie implementată și `Equatable`
static func == (lhs: Settings, rhs: Settings) -> Bool {
lhs.difficulty == rhs.difficulty && lhs.volume == rhs.volume
}
}
// Exemplu de utilizare
let users: [User: String] = [User(id: UUID(), name: "Alice"): "Manager"]
let gameSettings: [Settings: Bool] = [Settings(difficulty: 5, volume: 0.8): true]
Este, de asemenea, necesar să se implementeze protocolul Equatable, deoarece Hashable moștenește de la Equatable. Compilatorul generează automat implementarea Equatable pentru structurile ale căror proprietăți sunt, de asemenea, Equatable. Pentru clase sau structuri cu proprietăți non-Equatable (sau pentru logica de comparare personalizată), este necesară o implementare manuală a ==.