[iOS/Swift] 스위프트의 고차 함수 map, filter, reduce

이민경·2022년 10월 8일
0




고차 함수란?

함수를 인자로 받거나 결과로 반환하는 함수

  • 스위프트의 함수(클로저)는 다른 함수에 매개변수로 제공하거나, 함수가 함수를 반환할 수 있으며, 변수에도 할당할 수 있다.
  • 스위프트 표준 라이브러리는 스위프트에서 제공하는 컬렉션 타입(Array, Set, Dictionary 등)에 대해 유용한 고차함수들을 제공한다. (map, reduce, filter)







map

map 함수는 컨테이너가 갖고 있던 요소들을 매개변수를 통해 받은 함수를 통해 변형(transform)하여 새로운 컨테이너를 생성해서 반환한다.

  • 기존 컨테이너의 값들은 변형하지 않는다.



Apple Developer 공식 홈페이지에서 map 함수는 아래와 같이 정의되어 있다.

func map<T>(_ transform: (Self.Element) throws -> T) rethrows -> [T]
  • map 함수의 매개변수 : Element(제네릭)을 받아서 T(제네릭)를 반환하는 transform 함수. 이 transform 함수는 throws를 통해 오류가 발생할 수 있는 함수라는 것을 알 수 있다.
  • map 함수의 반환 값 : [T]



map 예제, 사용법

다음은 map함수를 사용해서 [1, 2, 3, 4, 5]인 배열의 각 요소에 2를 곱한 새로운 배열을 얻어 출력해보는 예제이다.

let array : [Int] = [1,2,3,4,5]
let myArray : [Int] = array.map( { (element: Int) -> Int in 
		return element * 2 } )
print("\(multipliedArray)") // [2,4,6,8,10]


클로저의 축약 문법을 사용하면 아래처럼 간단하게도 나타낼 수 있다.

let array : [Int] = [1,2,3,4,5]
let myArray : [Int] = array.map { $0 * 2 }
print("\(multipliedArray)") // [2,4,6,8,10]




filter

filter 함수는 반환 타입이 Bool인 매개변수 함수의 결과가 true이면 새로운 컨테이너를 생성해서 해당 값을 담아 반환한다.

  • 기존 컨테이너의 값들은 변형하지 않는다.





Apple Developer 공식 홈페이지에서 filter 함수는 아래와 같이 정의되어 있다.

func filter(_ isIncluded: (Self.Element) throws -> Bool) rethrows -> [Self.Element]
  • filter 함수의 매개변수 : Element(제네릭)을 받아서 Bool값을 반환하는 isIncluded 함수. 이 isIncluded 함수는 throws를 통해 오류가 발생할 수 있는 함수라는 것을 알 수 있다.
  • filter 함수의 반환 값 : [T]


filter 예제, 사용법

다음은 filter함수를 사용해서 [1, 2, 3, 4, 5]인 배열의 각 요소에서 짝수에 해당하는 값들을 갖는 새로운 배열을 얻어 출력해보는 예제이다.

let array : [Int] = [1,2,3,4,5]
let myArray : [Int] = array.filter { (element) -> Bool in
    return element % 2 == 0

}
print("\(myArray)") // [2,4]


클로저의 축약 문법을 사용하면 아래처럼 간단하게도 나타낼 수 있다.

let array : [Int] = [1,2,3,4,5]
let myArray : [Int] = array.filter { $0 % 2 == 0 }
> print("\(myArray)") // [2,4,6,8,10]




reduce

reduce 함수는 주어진 클로저를 사용하여 컨테이너의 요소를 결합한 결과를 반환한다.

  • 컨테이너 내부의 각 요소들을 재귀적으로 클로저를 적용시켜 결합한 결과를 반환한다.



Apple Developer 공식 홈페이지에서 reduce 함수는 아래와 같이 정의되어 있다.

func reduce<Result>(
    _ initialResult: Result,
    _ nextPartialResult: (Result, Self.Element) throws -> Result
) rethrows -> Result
  • reduce 함수의 매개변수 : 초기 값인 initialResult, 초기 값과 컨테이너의 요소를 매개변수로 받고 하나의 반환 값을 가지는 함수인 nextPartialResult. 이 nextPartialResult 함수는 throws를 통해 오류가 발생할 수 있는 함수라는 것을 알 수 있다.
  • reduce 함수의 반환 값 : 결합한 결과 값. 컨테이너 내부에 요소가 없으면 결과 값은 초기 값인 initialResult이다.



reduce 예제, 사용법

다음은 reduce함수를 사용해서 [1, 2, 3, 4, 5]인 배열의 각 요소를 더한 값을 sum이라는 변수에 담아 출력해보는예제이다.

let array : [Int] = [1,2,3,4,5]
let sum : Int = array.reduce(0, { (first: Int, second: Int) -> Int in
    return first + second
})
print("\(sum)") // 15


클로저의 축약 문법을 사용하면 아래처럼 간단하게도 나타낼 수 있다.

let array : [Int] = [1,2,3,4,5]
let sum : Int = array.reduce(0) { $0 + $1 }
print("\(sum)") // 15








잘못된 내용이 있다면 언제든지 댓글로 알려주시면 감사하겠습니다!

0개의 댓글