En Swift hay tres colecciones estándar principales: Array, Set y Dictionary. Cada una de ellas implementa diferentes interfaces, difiere en su estructura interna y está destinada a diferentes tareas.
Historia del asunto:
Las colecciones en Swift están diseñadas con un enfoque en la seguridad de tipos (type safety) y el rendimiento, incluyendo semánticas de valor y copia bajo demanda para Arrays/Set/Dictionary.
Problema:
A menudo, un desarrollador principiante usa solo Array donde sería más correcto aplicar Set o Dictionary, lo que lleva a un desperdicio de memoria y a una disminución de la velocidad de acceso/búsqueda. Es importante entender las diferencias.
Solución:
Colección ordenada de elementos, acceso por índice, se permiten duplicados. Normalmente implementada a través de un buffer dinámico.
Colección no ordenada de elementos únicos (Hashable). Acceso por hash — muy rápido, no se permiten duplicados.
Colección de pares clave-valor. La clave debe ser Hashable. Acceso al valor por clave (a través de una tabla hash).
Ejemplo de código:
var arr: [Int] = [1, 2, 3, 4] var set: Set<Int> = [1, 2, 2, 3] var dict: [String: Int] = ["a": 1, "b": 2] // set == [1, 2, 3] — los duplicados se descartan
Características clave:
¿Se pueden usar tipos no Hashable como elementos de Set o Dictionary?
No. Para almacenar en Set/Dictionary, el elemento debe ser Hashable (tener un identificador hash único). De lo contrario, el compilador no permitirá crear la colección.
struct Point {} // Set<Point> dará error, ya que Point no es Hashable
¿El orden de almacenamiento de los elementos en Set es el mismo que al añadirlos?
No. Set no garantiza el orden: la iteración puede dar cualquier orden. Si necesitas orden, usa Array.
¿Qué sucederá al intentar acceder a una clave inexistente en Dictionary?
Dictionary devolverá un Optional. Ten cuidado: intentar acceder a una clave inexistente devolverá nil, no un error.
let val = dict["not exist"] // val — nil
Un desarrollador utiliza Array para una lista única de usuarios y busca la unicidad a través de contains. En listas grandes — mucho tiempo en comprobaciones.
Ventajas:
Desventajas:
La misma lista implementada como Set. La verificación de existencia es instantánea, se garantizan valores únicos.
Ventajas:
Desventajas: