Junior
Wat moet er gedaan worden zodat de structuur of klasse van de gebruiker een sleutel in een woordenboek wordt?
sobes.tech AI
Antwoord van AI
Structuren of klassen moeten hashbaar zijn. Voor een structuur of klasse die alleen hashbare typen bevat (bijvoorbeeld Int, String, Bool), genereert de compiler automatisch de implementatie van het Hashable protocol. Als de structuur of klasse niet-hashbare typen bevat of speciale hash-logica vereist, moet:
- Het
Hashableprotocol worden geïmplementeerd. - In de methode
hash(into:), de hashbare componenten van de instantie worden toegevoegd aan de meegeleverde hasher.
struct User: Hashable {
let id: UUID // UUID is standaard hashbaar
let name: String // String is standaard hashbaar
// Wordt automatisch gegenereerd als alle eigenschappen hashbaar zijn
// 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
}
// Handmatige implementatie voor de klasse
func hash(into hasher: inout Hasher) {
hasher.combine(difficulty)
hasher.combine(volume)
}
// Ook moet de `Equatable`-implementatie worden toegevoegd
static func == (lhs: Settings, rhs: Settings) -> Bool {
lhs.difficulty == rhs.difficulty && lhs.volume == rhs.volume
}
}
// Voorbeeld van gebruik
let users: [User: String] = [User(id: UUID(), name: "Alice"): "Manager"]
let gameSettings: [Settings: Bool] = [Settings(difficulty: 5, volume: 0.8): true]
Het is ook nodig om het Equatable-protocol te implementeren, omdat Hashable ervan erft. De compiler genereert automatisch de Equatable-implementatie voor structs waarvan de eigenschappen ook Equatable zijn. Voor klassen of structs met niet-Equatable eigenschappen (of voor aangepaste vergelijkingslogica) is een handmatige implementatie van == vereist.