wandres.dev
FUNDAMENTOS · tipos, opcionales, closures

Colecciones: Array, Dictionary y Set

Las tres estructuras de datos que usarás a diario, cómo recorrerlas con bucles y rangos, y las operaciones que las hacen potentes.

⏱ 14 min

Casi todo en una app es una colección de cosas: una lista de tareas, un mapa de ajustes, un conjunto de etiquetas. Swift te da tres estructuras para ello, todas con seguridad de tipos: sabes exactamente qué contienen.

🎯 Al terminar esta lección sabrás
  • Arrays: listas ordenadas.
  • Dictionaries: pares clave-valor.
  • Sets: conjuntos sin duplicados.
  • Recorrerlas con bucles y rangos.

Array: listas ordenadas

Una secuencia ordenada de elementos del mismo tipo:

var frutas = ["manzana", "pera", "uva"]   // [String]
frutas.append("kiwi")                      // añadir al final
frutas.insert("mango", at: 0)              // insertar en una posición
let primera = frutas[0]                     // acceder por índice
frutas.remove(at: 1)                        // quitar
print(frutas.count)                         // cuántos hay
print(frutas.isEmpty)                       // ¿está vacío?
print(frutas.contains("uva"))               // ¿contiene X?
⚠️
Cuidado con los índices

Acceder a frutas[10] cuando solo hay 4 elementos crashea. Para acceso seguro, comprueba antes (indices.contains) o usa first/last, que devuelven opcionales:

let primera = frutas.first    // String? (nil si está vacío)

Dictionary: clave → valor

Asocia claves únicas con valores. Ideal para buscar por identificador:

var edades = ["Ana": 30, "Luis": 25]   // [String: Int]
edades["Marta"] = 28                    // añadir o actualizar
let edadAna = edades["Ana"]             // Int? (opcional: la clave podría no existir)
edades["Luis"] = nil                    // eliminar
print(edades.count)

Fíjate: acceder por clave devuelve un opcional, porque esa clave podría no estar. Ahí vuelven a aparecer los opcionales de la lección anterior.

Set: sin duplicados

Un conjunto no ordenado de elementos únicos. Perfecto cuando no quieres repetidos y necesitas comprobar pertenencia rápido:

var etiquetas: Set<String> = ["swift", "ios", "swift"]
print(etiquetas.count)          // 2 — el duplicado se ignora
etiquetas.insert("swiftui")
print(etiquetas.contains("ios")) // true

// operaciones de conjuntos
let a: Set = [1, 2, 3]
let b: Set = [3, 4, 5]
print(a.intersection(b))        // {3}
print(a.union(b))               // {1,2,3,4,5}

Recorrer con bucles

El bucle for-in recorre cualquier colección:

for fruta in frutas {
    print(fruta)
}

// diccionario: clave y valor
for (nombre, edad) in edades {
    print("\(nombre) tiene \(edad) años")
}

// con el índice, si lo necesitas
for (i, fruta) in frutas.enumerated() {
    print("\(i): \(fruta)")
}

Rangos

Genera secuencias de números con ... (incluye el final) o ..< (lo excluye):

for i in 1...5 { print(i) }      // 1, 2, 3, 4, 5
for i in 0..<frutas.count { }    // 0 hasta count-1

while contador < 10 { contador += 1 }   // while también existe
Piensa en colecciones, no en índices

Un reflejo de Swift maduro: en vez de bucles con índices manuales (for i in 0..<array.count), recorre directamente los elementos (for x in array) o usa operaciones de alto nivel (map, filter, reduce — próxima lección). El código queda más claro, más seguro (adiós errores de índice) y más cercano a lo que quieres expresar. Los índices son la excepción, no la norma.

⚔️ Maneja datos de verdad
  1. Crea un array de tus lenguajes favoritos y añade uno con append.
  2. Crea un diccionario de nombre: edad y accede a una edad (fíjate que es opcional).
  3. Crea un Set con duplicados y comprueba que se ignoran.
  4. Recorre el diccionario imprimiendo “X tiene Y años”.
  5. Usa un rango 1...10 para imprimir los números en un bucle.