Menu
Coddy logo textTech

compactMap

Parte de la sección Lógica y Flujo del Journey de Swift de Coddy — lección 28 de 56.

compactMap es map con los opcionales filtrados. El cierre puede devolver un Optional; compactMap descarta los resultados nil y desenvuelve el resto.

let strings = ["3", "hi", "7", "!", "1"]
let numbers = strings.compactMap { Int($0) }
print(numbers)               // [3, 7, 1]

Int("hi") devuelve nil porque no puede analizar un número de "hi". compactMap los descarta automáticamente y te devuelve un [Int] limpio.

Sin ello, escribirías strings.map { Int($0) } y obtendrías un [Int?] con nils mezclados, luego tendrías que filtrarlos tú mismo. compactMap realiza ambos pasos en uno.

challenge icon

Desafío

Fácil

Lee una sola línea de entrada: una mezcla separada por comas de enteros y texto basura (algunas entradas no se pueden analizar).

Imprime:

  1. Los enteros (en el orden de entrada), unidos con ,
  2. Cuántas entradas se descartaron (no se pudieron analizar)
  3. La suma de los enteros analizados

Para la entrada 3,hi,7,!,1,42,oops, la salida es:

3,7,1,42
3
53

Hoja de referencia

compactMap funciona como map pero elimina automáticamente los resultados nil y desenvuelve el resto:

let strings = ["3", "hi", "7", "!", "1"]
let numbers = strings.compactMap { Int($0) }
// [3, 7, 1]  — los nils de las cadenas que no se pueden procesar se descartan

Sin compactMap, map devolvería [Int?] con nils mezclados, lo que requeriría un paso de filtrado por separado.

Pruébalo tú mismo

let parts = readLine()!.components(separatedBy: ",")

// TODO: compactMap a enteros; imprimir unidos, cantidad descartada, suma
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y Flujo