compactMap
Parte da seção Lógica e Fluxo do Journey de Swift da Coddy — lição 28 de 56.
compactMap é o map com os opcionais filtrados. A closure pode retornar um Optional; o compactMap descarta os resultados nil e desembrulha o restante.
let strings = ["3", "hi", "7", "!", "1"]
let numbers = strings.compactMap { Int($0) }
print(numbers) // [3, 7, 1]Int("hi") retorna nil porque não consegue analisar um número de "hi". compactMap descarta esses automaticamente e fornece um [Int] limpo.
Sem isso, você escreveria strings.map { Int($0) } e obteria um [Int?] com nils misturados, e então teria que filtrá-los você mesmo. O compactMap faz ambos os passos em um só.
Desafio
FácilLeia uma única linha de entrada: uma mistura separada por vírgulas de inteiros e texto lixo (algumas entradas não podem ser analisadas).
Imprima:
- Os inteiros (na ordem de entrada), unidos com
, - Quantas entradas foram descartadas (não puderam ser analisadas)
- A soma dos inteiros analisados
Para a entrada 3,hi,7,!,1,42,oops, a saída é:
3,7,1,42
3
53Folha de consulta
compactMap funciona como o map, mas remove automaticamente os resultados nil e desempacota o restante:
let strings = ["3", "hi", "7", "!", "1"]
let numbers = strings.compactMap { Int($0) }
// [3, 7, 1] — nils de strings que não podem ser convertidas são descartadosSem o compactMap, o map retornaria [Int?] com nils misturados, exigindo uma etapa de filtragem separada.
Experimente você mesmo
let parts = readLine()!.components(separatedBy: ",")
// TODO: compactMap para ints; imprimir unidos, contagem de descartados, soma
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