Problema
Al trabajar con listas de modelos (por ejemplo, resultados, eventos o usuarios), a menudo necesitamos acceso O(1) por identificador para búsquedas, merges o deduplicación.
Sin embargo, en muchos dominios el id puede ser opcional (UUID?) hasta que el backend lo asigne. Si construimos un diccionario directamente, aparecen dos fricciones:
- Hay que filtrar los elementos sin ID para evitar entradas inválidas.
- Debemos garantizar unicidad de las claves o el constructor de Dictionary(uniqueKeysWithValues:) fallará en tiempo de ejecución si hay duplicados.
Solución
Extendemos Array (cuando sus elementos son Identifiable con ID == UUID?) para exponer toDictionary().
La función usa compactMap para descartar elementos sin ID y construye el diccionario con Dictionary(uniqueKeysWithValues:).
Precondición: los IDs existentes deben ser únicos en la colección. Si esperas colisiones, considera una variante con Dictionary(_, uniquingKeysWith:) para resolver duplicados.
extension Array where Element: Identifiable, Element.ID == UUID? {
func toDictionary() -> [UUID: Element] {
Dictionary(uniqueKeysWithValues: self.compactMap {
guard let id = $0.id else { return nil }
return (id, $0) }
)
}
}
Notas:
- Los elementos con id == nil no se incluyen.
- El acceso por clave es O(1) y simplifica merges/joins en memoria.
Resultado
Un helper pequeño y claro para pasar de un array a un mapa por ID:
- Más rápido de consultar O(1).
- Más seguro: evita insertar elementos sin identificador.
- Más expresivo y reutilizable en servicios y view models.
Keep coding, keep running 🏃♂️