파이프라인 구축하기
Coddy Swift 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 31번째.
지금까지 살펴본 map, filter, reduce, compactMap, flatMap, sorted(by:) 메서드들은 Swift의 일상적인 도구 모음입니다. 실제 코드에서는 이들을 함께 엮어서 사용합니다.
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"]체인을 위에서 아래로 읽으세요: 비어 있지 않은 주문을 유지하고, 수량에 따라 내림차순으로 정렬한 다음, 이름만 남깁니다.
파이프라인은 각 단계가 하나의 목적을 가질 때 효과적입니다. 클로저 내부에서 두 가지 일(매핑과 필터링)을 동시에 하고 있다면, 이를 두 단계로 나누세요. 체인이 길어져도 가독성이 유지됩니다.
챌린지
중급한 줄의 입력을 읽으십시오: 쉼표로 구분된 name:price:qty 항목 목록입니다. 일부 항목은 형식이 잘못되었으므로 건너뛰어야 합니다: 가격(price)이나 수량(qty)이 유효한 정수가 아닌 모든 항목이 해당됩니다.
qty > 0인 유효한 항목당 한 줄씩 생성하고, 합계(price * qty)를 기준으로 내림차순 정렬하여 다음 형식으로 출력하는 파이프라인을 구축하십시오:
<name>: <total>항목별 줄 다음에, 전체 합계를 포함한 요약 줄 하나를 출력하십시오: Sum: <n>
입력 apple:3:2,bread:bad:1,milk:4:5,cheese:8:0,salt:2:7에 대한 출력은 다음과 같습니다:
milk: 20
salt: 14
apple: 6
Sum: 40치트 시트
고차 함수를 체이닝하면 각 단계가 하나의 목적을 갖는 가독성 좋은 파이프라인을 만들 수 있습니다:
let names = orders
.filter { $0.qty > 0 }
.sorted { $0.qty > $1.qty }
.map { $0.item }
일반적인 파이프라인 메서드: filter → compactMap → sorted(by:) → map → reduce. 만약 클로저가 한 번에 두 가지 작업(예: 매핑과 필터링)을 수행한다면, 이를 두 단계로 나누세요.
직접 해보기
let entries = readLine()!.components(separatedBy: ",")
// TODO: compactMap (parse), filter (qty > 0)를 사용한 파이프라인,
// sorted (total 내림차순), map (format); 라인 출력 + Sum
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.