Menu
Coddy logo textTech

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.

challenge icon

Desafío

Intermedio

Lee 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: 40

Hoja 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): filtercompactMapsorted(by:)mapreduce. 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
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