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.
Desafio
MédioLeia 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: 40Folha 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: filter → compactMap → sorted(by:) → map → reduce. 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
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
1Strings a Fundo
Contagem e ÍndicesCase e TrimBusca em StringsDivisão e JunçãoSubstituindo SubstringsRecapitulação - Verificação de Nome de Usuário4Conjuntos
Criando ConjuntosUnião e InterseçãoSubtração e Diferença SimétricaSubconjunto e SuperconjuntoRecapitulação - Filtro de Tags7Projeto - Monitor de Hábitos
Visão Geral do ProjetoMarcar como Concluído10Projeto - Mecanismo de Quiz
Visão Geral do ProjetoFazer Perguntas2Intervalos e Strides
Fechado vs Meio-AbertoStrideMétodos de IntervaloIntervalos no SwitchRecapitulação - Grade de Calendário5Funções de Ordem Superior Parte 1
MapFilterReduceEncadeando map, filter, reduceRecapitulação - Estatísticas de Palavras3Dicionários
Declarando DicionáriosBusca OpcionalAtualizando DicionáriosIterando DicionáriosAgrupando ValoresRecapitulação - Inventário6Funções de Ordem Superior Parte 2
compactMapflatMapsorted(by:)Construindo PipelinesRecapitulação - Leaderboard