티스토리 뷰
Swift의 대표적인 고차함수인 map, filter, reduce에 대해 정리해보도록 하겠습니다.
먼저 고차함수(Higher-order function)은 '다른 함수를 전달인자로 받거나 함수 실행의 결과를 함수로 반환하는 함수'를 뜻합니다.
Swift의 함수(Closure)는 일급 객체이기 때문에 함수의 전달인자로 사용할 수 있으며, 함수의 결과값으로 반환할 수 있습니다.
이제 Swift 표준 라이브러리 컨테이너 타입(Array, Set, Dictionary)에 구현되어있는 고차함수인 map, filter, reduce에 대해 알아보겠습니다.
1. map
map은 애플 공식 문서에 '시퀀스의 요소에 대해 주어진 클로저를 매핑한 결과를 포함하는 배열을 반환한다'고 정의되어있습니다.
map의 파라미터인 transform은 매핑 클로저로, 시퀀스의 요소를 매개변수로 받아들이고 동일하거나 다른 유형의 변환된 값을 반환합니다.
즉, map은 데이터를 변형할 때 사용합니다.
for-in 구문의 동작과 큰 차이는 없지만 map을 사용하면 기존의 데이터 변형없이 간결한 코드로 표현할 수 있습니다.
예를 들어, 아래와 같은 Int 배열(numbers)의 값들이 모두 두 배인 새로운 Int 배열(doubledNumbers)을 만들고 싶은 경우에 for-in 구문을 활용하면 아래와 같이 작성할 수 있습니다.
let numbers: [Int] = [1, 2, 3, 4, 5]
var doubledNumbers = [Int]()
for number in numbers {
doubledNumbers.append(number*2)
}
print(doubledNumbers) // [0, 2, 4, 6, 8, 10]
위와 같은 기능을 하는 코드를 map을 활용하면 아래와 같이 작성할 수 있습니다.
let numbers: [Int] = [1, 2, 3, 4, 5]
// map 기본형
doubledNumbers = numbers.map({(number: Int) -> Int in
return number * 2
})
// map 축약형
doubledNumbers = numbers.map({ $0 * 2})
// 기본형과 축약형 모두 같은 결과를 반환
print(doubledNumbers) // [0, 2, 4, 6, 8, 10]
2. filter
filter는 애플 공식 문서에 '주어진 조건을 만족하는 시퀀스의 요소를 순서대로 포함하는 배열을 반환한다'고 정의되어 있습니다.
filter는 파라미터인 isIncluded를 통해 해당 조건을 포함하는지 (true), 제외하는지 (false) 판단하여 Boolean 값을 반환합니다.
즉, filter는 조건을 만족하는 데이터가 필요할 때 사용합니다.
예를 들어, 아래와 같은 Int 배열(numbers)의 값 중 짝수인 수 들만 포함한 새 Int 배열 (filtered)을 만들고 싶은 경우에 for-in 구문을 활용하면 아래와 같이 작성할 수 있습니다.
let numbers: [Int] = [1, 2, 3, 4, 5]
var filtered = [Int]()
for number in numbers {
if number % 2 == 0 {
filtered.append(number)
}
}
print(filtered) // [2, 4]
위와 같은 기능을 하는 코드를 filter를 활용하면 아래와 같이 작성할 수 있습니다.
let numbers = [1, 2, 3, 4, 5]
// filter 기본형
let filtered: [Int] = numbers.filter({(number: Int) -> Bool in
return number % 2 == 0
})
// filter 축약형
let filtered: [Int] = numbers.filter({ $0 % 2 == 0})
// 기본형과 축약형 모두 같은 결과를 반환
print(filtered) // [2, 4]
3. reduce
reduce는 애플 공식 문서에 '주어진 클로저를 사용해 시퀀스의 요소를 결합한 결과를 반환한다'고 정의되어 있습니다.
reduce는 아래의 두 가지의 파라미터를 가집니다.
1) initialResult : 초기 누적 값으로 사용되는 파라미터로, 클로저가 처음 실행될 때 nextPartialResult에 전달됩니다.
2) nextPartialResult : nextPartialResult 클로저의 다음 호출에 사용되거나, 호출자에게 반환될 누적 값과 시퀀스의 요소를 새로운 누적 값으로 결합하는 클로저입니다.
그리고 reduce는 위 파라미터를 사용해 계산된 최종 누적 값을 반환합니다.
즉, reduce는 시퀀스 데이터를 연산을 통해 하나로 통합 할 때 사용합니다.
예를 들어, 아래와 같은 Int 배열(someNumbers)의 값을 모두 합한 하나의 Int 값을 구하고 싶은 경우에 for-in 구문을 활용하면 아래와 같이 작성할 수 있습니다.
let someNumbers: [Int] = [2, 8, 15]
var result: Int = 0
for number in someNumbers {
result += number
}
print(result) // 25
위와 같은 기능을 하는 코드를 reduce를 활용하면 아래와 같이 작성할 수 있습니다.
let someNumbers: [Int] = [2, 8, 15]
// reduce 기본형
// 초기 값이 0이고 someNumbers 내부의 모든 값을 더하는 기능을 수행함.
let sum: Int = someNumbers.reduce(0, {(first: Int, second: Int) -> Int in
return first + second
})
// reduce 축약형
// reduce기본형과 같은 기능을 수행함.
let sum: Int = someNumbers.reduce(0) { $0 + $1 }
// 기본형과 축약형 모두 같은 값을 반환
print(sum) // 25
참고:
https://developer.apple.com/documentation/swift/array/3017522-map
https://developer.apple.com/documentation/swift/sequence/3018365-filter
https://developer.apple.com/documentation/swift/array/2298686-reduce
https://yagom.github.io/swift_basic/contents/22_higher_order_function/
'iOS > Swift' 카테고리의 다른 글
Swift - Generic의 개념 (0) | 2022.02.13 |
---|---|
Swift - protocol (0) | 2021.04.25 |
Swift 문법 (11) - 클로저 (Closure) 고급 (0) | 2020.12.13 |
Swift 문법 (10) - 클로저 (Closure) (0) | 2020.12.09 |
Swift 문법 (9) - 열거형 (0) | 2020.12.08 |
- Total
- Today
- Yesterday
- 코코아팟
- SWEA
- 안드로이드
- blendshapes
- SwiftUI
- 카카오인턴십
- ARKit
- DispatchQueue
- Swift
- infallible
- Lottie
- 프로그래머스
- coreml
- boj
- 백준
- 백준온라인저지
- ios
- blendshape
- GraphDB
- disposeBag
- Neo4j
- C++
- rxswift
- 알고리즘
- rxswift6
- mergesort
- bounds
- Kotlin
- Reactivex
- cocoapods
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |