Junior
¿Qué se necesita hacer para que la estructura o clase de usuario se convierta en una clave en un diccionario?
sobes.tech AI
Respuesta de la IA
Las estructuras o clases deben ser hashables. Para una estructura o clase que contiene solo tipos hashables (por ejemplo, Int, String, Bool), el compilador genera automáticamente la implementación del protocolo Hashable. Si la estructura o clase contiene tipos no hashables o requiere lógica especial de hash, es necesario:
- Implementar el protocolo
Hashable. - En el método
hash(into:), agregar los componentes hashables de la instancia al hasher proporcionado.
struct User: Hashable {
let id: UUID // UUID es Hashable por defecto
let name: String // String es Hashable por defecto
// Se genera automáticamente si todas las propiedades son 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
}
// Implementación manual para la clase
func hash(into hasher: inout Hasher) {
hasher.combine(difficulty)
hasher.combine(volume)
}
// También se requiere la implementación de Equatable para Hashable
static func == (lhs: Settings, rhs: Settings) -> Bool {
lhs.difficulty == rhs.difficulty && lhs.volume == rhs.volume
}
}
// Ejemplo de uso
let users: [User: String] = [User(id: UUID(), name: "Alice"): "Manager"]
let gameSettings: [Settings: Bool] = [Settings(difficulty: 5, volume: 0.8): true]
También es necesario implementar el protocolo Equatable, ya que Hashable hereda de Equatable. El compilador genera automáticamente la implementación de Equatable para estructuras cuyas propiedades también sean Equatable. Para clases o estructuras con propiedades no Equatable (o para lógica de comparación personalizada), se requiere una implementación manual de ==.