Menu
Coddy logo textTech

Construindo Pipelines

Parte da seção Lógica e Fluxo do Journey de Swift da Coddy — lição 31 de 56.

Os métodos que você coletou, map, filter, reduce, compactMap, flatMap, sorted(by:), são o kit de ferramentas diário do Swift. O código real os une.

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"]

Leia a sequência de cima para baixo: mantenha os pedidos não vazios, ordene por quantidade decrescente e, em seguida, mantenha apenas os nomes.

Pipelines vencem quando cada etapa tem um único propósito. Se você se encontrar fazendo duas coisas ao mesmo tempo dentro de uma closure (mapeando e filtrando), divida-as em duas etapas. A cadeia permanece legível à medida que cresce.

challenge icon

Desafio

Médio

Leia uma única linha de entrada: uma lista separada por vírgulas de entradas name:price:qty. Algumas entradas estão malformadas e devem ser ignoradas: qualquer entrada cujo preço ou quantidade não seja um número inteiro válido.

Construa um pipeline que produza uma linha por entrada válida com qty > 0, ordenada pelo total (price * qty) em ordem decrescente, no formato:

<name>: <total>

Após as linhas por item, imprima uma linha de resumo: Sum: <n> com o total geral.

Para a entrada apple:3:2,bread:bad:1,milk:4:5,cheese:8:0,salt:2:7, a saída é:

milk: 20
salt: 14
apple: 6
Sum: 40

Folha de consulta

Encadear funções de ordem superior cria pipelines legíveis onde cada etapa tem um único propósito:

let names = orders
    .filter { $0.qty > 0 }
    .sorted { $0.qty > $1.qty }
    .map { $0.item }

Métodos comuns de pipeline: filtercompactMapsorted(by:)mapreduce. Se uma closure faz duas coisas ao mesmo tempo (ex: mapear e filtrar), divida-a em duas etapas.

Experimente você mesmo

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

// TODO: pipeline usando compactMap (parse), filter (qty > 0),
// sorted (total desc), map (format); imprimir linhas + Sum
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica e Fluxo