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.
Desafío
FácilLee una sola línea de entrada: una mezcla separada por comas de enteros y texto basura (algunas entradas no se pueden analizar).
Imprime:
- Los enteros (en el orden de entrada), unidos con
, - Cuántas entradas se descartaron (no se pudieron analizar)
- La suma de los enteros analizados
Para la entrada 3,hi,7,!,1,42,oops, la salida es:
3,7,1,42
3
53Hoja 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 descartanSin 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
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
1Strings a fondo
Conteo e índicesMayúsculas, minúsculas y TrimBúsqueda en StringsDividir y unirReemplazo de subcadenasResumen: Validación de usuario4Conjuntos
Crear conjuntosUnión e intersecciónResta y diferencia simétricaSubconjunto y superconjuntoResumen - Filtro de etiquetas7Proyecto - Seguimiento de hábitos
Descripción general del proyectoMarcar como completado10Proyecto - Motor de cuestionarios
Descripción general del proyectoHacer preguntas2Rangos e Intervalos
Cerrados vs. SemiabiertosSaltos (Stride)Métodos de RangosRangos en SwitchResumen - Cuadrícula de calendario5Funciones de orden superior Pt. 1
MapFilterReduceEncadenar map, filter, reduceResumen - Estadísticas de palabras3Diccionarios
Declaración de diccionariosBúsqueda opcionalActualización de diccionariosIteración de diccionariosAgrupación de valoresResumen - Inventario6Funciones de orden superior - Parte 2
compactMapflatMapsorted(by:)Construcción de pipelinesRepaso - Tabla de posiciones