Construcción de pipelines
Parte de la sección Lógica y Flujo del Journey de Swift de Coddy — lección 31 de 56.
Los métodos que has recopilado, map, filter, reduce, compactMap, flatMap, sorted(by:), son el kit de herramientas diario de Swift. El código real los entrelaza.
struct Order {
let item: String
let qty: Int
}
let orders = [Order(item: "apple", qty: 3), Order(item: "bread", qty: 0), Order(item: "milk", qty: 5)]
let names = orders
.filter { $0.qty > 0 }
.sorted { $0.qty > $1.qty }
.map { $0.item }
print(names) // ["milk", "apple"]Lee la cadena de arriba hacia abajo: mantén los pedidos no vacíos, ordena por cantidad de forma descendente y luego mantén solo los nombres.
Los pipelines ganan cuando cada paso tiene un único propósito. Si te encuentras haciendo dos cosas a la vez dentro de un closure (mapeando y filtrando), divídelas en dos pasos. La cadena se mantiene legible a medida que crece.
Desafío
IntermedioLee una sola línea de entrada: una lista separada por comas de entradas name:price:qty. Algunas entradas están mal formadas y deben omitirse: cualquier entrada cuyo precio o cantidad no sea un número entero válido.
Construye un pipeline que produzca una línea por cada entrada válida con qty > 0, ordenada por el total (price * qty) de forma descendente, en el formato:
<name>: <total>Después de las líneas por artículo, imprime una línea de resumen: Sum: <n> con el gran total.
Para la entrada apple:3:2,bread:bad:1,milk:4:5,cheese:8:0,salt:2:7, la salida es:
milk: 20
salt: 14
apple: 6
Sum: 40Hoja de referencia
Encadenar funciones de orden superior crea flujos de trabajo (pipelines) legibles donde cada paso tiene un único propósito:
let names = orders
.filter { $0.qty > 0 }
.sorted { $0.qty > $1.qty }
.map { $0.item }
Métodos comunes de flujos de trabajo (pipelines): filter → compactMap → sorted(by:) → map → reduce. Si un cierre (closure) hace dos cosas a la vez (por ejemplo, mapear y filtrar), divídelo en dos pasos.
Pruébalo tú mismo
let entries = readLine()!.components(separatedBy: ",")
// TODO: tubería usando compactMap (analizar), filter (cantidad > 0),
// sorted (total desc), map (formato); imprimir líneas + 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