Dictionary — un contenedor asociativo en Swift que almacena pares "clave-valor". Las claves deben implementar los protocolos Hashable y Equatable para garantizar la unicidad y el tiempo de acceso constante a los elementos.
Aspectos:
Hashable y Equatable.Ejemplo:
struct EmployeeID: Hashable { let company: String let id: Int } var employees: [EmployeeID: String] = [ EmployeeID(company: "A", id: 1): "Alice", EmployeeID(company: "B", id: 2): "Bob" ] let empName = employees[EmployeeID(company: "A", id: 1)] // Alice
¿Puede Dictionary aceptar un tipo de usuario como clave que no implemente Hashable?
— Incorrecto. Si el tipo no implementa Hashable, no puede actuar como clave. Intentar usarlo dará lugar a un error de compilación.
Ejemplo:
class Foo {} var dict: [Foo: Int] = [:] // Error: Foo no implementa Hashable
Historia
En el proyecto se almacenaron claves de Dictionary basadas en estructuras con arreglos dentro. La estructura no cumplía con el protocolo Hashable, lo que causaba que el Dictionary no funcionara. Solución: implementar un hashValue propio que considere todos los campos, incluidos los arreglos.
Historia
Se utilizaron subclases de NSObject como claves, confiando en la dirección del objeto. Después de reescribir parte del código para usar estructuras, los datos dejaron de coincidir: los valores hash de las estructuras se calculaban de manera diferente, lo que llevaba a la pérdida de accesibilidad a los datos.
Historia
Al almacenar un diccionario con una clave compleja, se olvidó implementar Equatable. El resultado fue que los elementos con parámetros idénticos se contaban como claves diferentes, lo que generaba duplicados y errores al buscar en el diccionario.