Menu
Coddy logo textTech

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ó.

challenge icon

Desafio

Fácil

Leia uma única linha de entrada: uma mistura separada por vírgulas de inteiros e texto lixo (algumas entradas não podem ser analisadas).

Imprima:

  1. Os inteiros (na ordem de entrada), unidos com ,
  2. Quantas entradas foram descartadas (não puderam ser analisadas)
  3. A soma dos inteiros analisados

Para a entrada 3,hi,7,!,1,42,oops, a saída é:

3,7,1,42
3
53

Folha 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 descartados

Sem 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
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