커스텀 고차 함수
Coddy Swift 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 42번째.
이제 여러분은 자신만의 고차 함수를 작성할 수 있으며, 이들은 map 및 filter와 함께 자연스럽게 어우러질 것입니다. 형태는 항상 동일합니다. 클로저 파라미터를 받고, 루프 내부에서 호출하며, 결과를 반환하는 것입니다.
extension Array {
func myMap<T>(_ transform: (Element) -> T) -> [T] {
var result: [T] = []
for item in self {
result.append(transform(item))
}
return result
}
}
[1, 2, 3].myMap { $0 * 10 } // [10, 20, 30]익스텐션이 부담스럽게 느껴진다면, 대신 일반 함수(free function)를 작성해 보세요. 개념은 동일합니다:
func count<T>(_ items: [T], where predicate: (T) -> Bool) -> Int {
var n = 0
for item in items where predicate(item) {
n += 1
}
return n
}클로저를 전달할 수 있게 되면, 표준 라이브러리는 더 이상 마법처럼 보이지 않고 직접 작성할 수 있는 일련의 패턴처럼 보이기 시작합니다.
챌린지
중급배열을 한 번 순회하며 튜플 (matched, rest)를 반환하는 프리 함수(free function) partition(_ items: [Int], by predicate: (Int) -> Bool) -> ([Int], [Int])를 작성하세요. 여기서 matched는 조건자(predicate)를 만족하는 요소들이고, rest는 나머지 요소들이며, 두 리스트 모두 원래의 순서를 유지해야 합니다.
두 줄을 입력받으세요: 정수 min과 쉼표로 구분된 정수 리스트입니다. n > min을 확인하는 조건자를 사용하여 작성한 partition 함수를 호출하세요. 다음을 출력하세요:
matched: <...>rest: <...>
각 리스트는 ,로 연결되어야 합니다 (출력할 내용이 없으면 비워둡니다).
입력이 5 / 2,7,3,8,5인 경우, 출력은 다음과 같습니다:
matched: 7,8
rest: 2,3,5치트 시트
고차 함수는 일관된 패턴을 따릅니다: 클로저를 받아들이고, 루프에서 호출하고, 결과를 반환합니다.
익스텐션(extension)으로 구현할 경우:
extension Array {
func myMap<T>(_ transform: (Element) -> T) -> [T] {
var result: [T] = []
for item in self {
result.append(transform(item))
}
return result
}
}
[1, 2, 3].myMap { $0 * 10 } // [10, 20, 30]프리 함수(free function)로 구현할 경우:
func count<T>(_ items: [T], where predicate: (T) -> Bool) -> Int {
var n = 0
for item in items where predicate(item) {
n += 1
}
return n
}일치하는 요소와 일치하지 않는 요소의 튜플을 반환하는 partition 함수:
func partition(_ items: [Int], by predicate: (Int) -> Bool) -> ([Int], [Int]) {
var matched: [Int] = []
var rest: [Int] = []
for item in items {
if predicate(item) { matched.append(item) }
else { rest.append(item) }
}
return (matched, rest)
}직접 해보기
let min = Int(readLine()!)!
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
// 할 일: partition(_:by:) -> ([Int], [Int]); 일치하는 항목과 나머지 출력
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.