Array to dictionary

Jorge supervisa una máquina de clasificación. Una cinta transportadora mueve cajas: las que no tienen ID caen en un cubo de descarte, mientras que las cajas con la etiqueta UUID continúan y se colocan en una estantería.

Tabla de contenidos


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 🏃‍♂️