Menu
Coddy logo textTech

compactMap

Coddy Swift 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 28번째.

compactMap은 옵셔널이 필터링된 map입니다. 클로저는 Optional을 반환할 수 있으며, compactMapnil 결과는 버리고 나머지는 언래핑합니다.

let strings = ["3", "hi", "7", "!", "1"]
let numbers = strings.compactMap { Int($0) }
print(numbers)               // [3, 7, 1]

Int("hi")"hi"에서 숫자를 파싱할 수 없기 때문에 nil을 반환합니다. compactMap은 이러한 것들을 자동으로 제거하고 깔끔한 [Int]를 반환합니다.

그것이 없다면, 여러분은 strings.map { Int($0) }라고 작성하고 nil이 섞인 [Int?]를 얻게 될 것이며, 그 후에는 직접 그것들을 필터링해야 할 것입니다. compactMap은 이 두 단계를 한 번에 수행합니다.

challenge icon

챌린지

쉬움

한 줄의 입력을 읽습니다: 쉼표로 구분된 정수와 가비지 텍스트의 혼합(일부 항목은 파싱할 수 없음)입니다.

출력:

  1. 정수들(입력 순서대로), ,로 연결하여 출력
  2. 삭제된 항목의 수(파싱할 수 없는 항목)
  3. 파싱된 정수들의 합계

입력 3,hi,7,!,1,42,oops에 대한 출력은 다음과 같습니다:

3,7,1,42
3
53

치트 시트

compactMapmap처럼 작동하지만 nil 결과를 자동으로 제거하고 나머지를 언랩(unwrap)합니다:

let strings = ["3", "hi", "7", "!", "1"]
let numbers = strings.compactMap { Int($0) }
// [3, 7, 1]  — 파싱할 수 없는 문자열에서 발생한 nil은 제거됩니다

compactMap이 없다면, mapnil이 섞인 [Int?]를 반환하므로 별도의 필터링 단계가 필요합니다.

직접 해보기

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

// TODO: 정수형으로 compactMap 처리; 조인된 결과, 누락된 개수, 합계를 출력하세요
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직 및 흐름의 모든 레슨