Map, Filter, Reduce 체이닝
Coddy Swift 여정의 로직 및 흐름 섹션에 포함된 레슨. 56개 중 26번째.
이 세 가지 메서드의 진정한 강력함은 서로 조합할 수 있다는 점입니다. 각 단계는 데이터를 변환한 뒤 다음 단계로 전달합니다.
let nums = [1, 2, 3, 4, 5, 6]
let result = nums
.filter { $0 % 2 == 0 } // [2, 4, 6]
.map { $0 * $0 } // [4, 16, 36]
.reduce(0, +) // 56
print(result) // 56위에서 아래로 읽으면: 짝수를 남기고, 제곱한 다음, 제곱의 합을 구합니다. 각 단계는 하나의 명확한 작업이므로, 체인이 길어져도 읽기 쉽습니다.
이 파이프라인 형태는 직접 작성한 루프를 명시적인 의도로 대체합니다. filter는 "선택"을 의미합니다. map은 "변환"을 의미합니다. reduce는 "축약"을 의미합니다.
독자는 인덱스 변수를 추적하지 않고도 체인을 훑어보며 무슨 일이 일어나는지 확인할 수 있습니다.
간단한 규칙 하나: 순서가 중요합니다. 필터가 선택적일 때는 매핑하기 전에 필터링하는 것이 필터링하기 전에 매핑하는 것보다 작업량이 적습니다.
챌린지
중급입력으로 쉼표로 구분된 price:quantity 쌍의 목록 한 줄을 읽습니다. 예를 들어, 3:2,5:1,2:4,7:0은 네 개의 주문을 의미합니다.
quantity > 0인 각 주문에 대해 행의 합계는 price * quantity입니다. 다음 세 줄을 출력합니다.
quantity > 0인 주문에 대해서만 계산한 행의 합계를,로 연결한 값- 해당 행의 합계 전체의 총합
- 계산에 포함된 주문의 수(즉, 0보다 큰 quantity를 가진 주문의 수)
filter 다음에 map을 사용하는 파이프라인을 구성한 다음, result에서 count와 sum을 계산합니다.
입력이 3:2,5:1,2:4,7:0이면 출력은 다음과 같습니다.
6,5,8
19
3직접 해보기
let orders = readLine()!.components(separatedBy: ",").map { pair -> (Int, Int) in
let parts = pair.components(separatedBy: ":")
return (Int(parts[0])!, Int(parts[1])!)
}
// TODO: quantity > 0 필터링, line totals로 매핑; joined, sum, count 출력
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
로직 및 흐름의 모든 레슨
직접 연습해 보세요: Swift 플레이그라운드