ProgramaciónDesarrollador iOS Junior

¿Cuáles son los tipos de colecciones en Swift, cómo se diferencian en su implementación interna y cuándo usar cada colección?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

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:

Array

Colección ordenada de elementos, acceso por índice, se permiten duplicados. Normalmente implementada a través de un buffer dinámico.

Set

Colección no ordenada de elementos únicos (Hashable). Acceso por hash — muy rápido, no se permiten duplicados.

Dictionary

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:

  • Array es eficiente para el acceso por índice, mantiene el orden, pero el acceso por valor es lineal
  • Set es rápido para buscar y verificar la existencia de un elemento, almacena solo valores Hashable únicos
  • Dictionary es óptimo para búsquedas por clave (Hashable), no mantiene el orden, pero busca y modifica valores rápidamente

Preguntas capciosas.

¿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

Errores comunes y anti-patrones

  • Usar Array para buscar un valor único (mejor usar Set)
  • Usar Dictionary para almacenar valores sin la necesidad de búsqueda por clave
  • Intentar usar tipos no Hashable como claves/valores

Ejemplo de la vida real

Caso negativo

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:

  • Facilidad de implementación

Desventajas:

  • Complejidad de búsqueda lineal, almacenamiento redundante de duplicados, alta carga de memoria

Caso positivo

La misma lista implementada como Set. La verificación de existencia es instantánea, se garantizan valores únicos.

Ventajas:

  • Acceso rápido, ahorro de memoria, eliminación de duplicados

Desventajas:

  • No hay garantías sobre el orden de los elementos