대표적인 고차함수인 Map, Filter, Reduce에 대해 알아보자…
Map, Filter, Reduce
고차함수 정의
고차함수란 다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수’를 뜻합니다.
Map
// Declaration
func map<U>(transform: (T) -> U) -> Array<U>
[x1, x2, ... xn].map(f) -> [f(x1), f(x2), ... , f(xn)]
하나의 array에서 연산 (f)를 걸친 새로운 array를 만들어낸다.
array.map({ (value -> Int in return value * value) })
|
|축약 후
|
array.map( { $0 * $0 })
다음과 같이 코드가 축약될 수 있는 이유는 swfit에서는 추론이 가능하기 때문이다.
Filter
// Declaration
func filter(includeElement: (T) -> Bool) -> Array<T>
includeElement를 지원하는 클로저는 항목이 포함되어야 하는지 아닌지 true or false 를 통해 확인한다.
array.filter( { (value) -> Bool in return value % 2 == 0})
위의 코드는 array의 value가 짝수라면 배열에 넣고 그렇지 않으면 넣지 않는 배열을 만드는 코드이다.
Reduce
// Declaration
func reduce<U>(initial: U, combine: (U, T) -> U) -> U
initial: U reduce을 적용시킬 배열의 첫번째 지점
combine: (U, T) -> U 클로저에서 두 값을 이용해서 연산될 함수
array.reduce(0, { (beforeValue: Int, afterValue: Int) -> Int in return beforeValue + afterValue})
|
| // 축약후
|
array.reduce(0, { $0 + $1 })
|
| // 더 축약한다면,
|
array.reduce(0, +)
reduce 동작과정
- initial값을 가지고 첫번째 연산을 진행한다.
- 그 이후 두 인자를 받아서 연산을 진행한다.
Example
array: [Int] = [1,2,3]
array.reduce(0, { (first, second) -> Int in
return first + second })
- initial 값을 가지고 만들어진 첫번째 연산 —> 0 + 1
- 그 이후 1 + 1 (index: 0) , 2 + 2 (index: 1), 4 + 3 (index: 2)
그러면 결과값으로 7을 얻을 수 있다.
PREVIOUSComputed Property vs Function