본문 바로가기
IOS App Programming/Swift

[Swift] 고차함수 - map, filter, reduce

by B_Tori 2023. 4. 12.

고차함수란?

  • 다른 함수를 전달인자로 받거나 함수의 실행 결과를 함수로 반환하는 함수이다.
  • swift의 대표적인 고차함수로는 map, filter, reduce가 있다.

 

map

  • 컨테이너 내부의 기존 데이터를 변형해 새 컨테이너를 생성한다.
  • 즉 전달받은 함수를 통해 변형된 데이터를 반환하여 새 컨테이너로 만들어준다.
    -> 기존값을 변경하는 것이 아니라 새로운 컨테이너를 생성하여 반환해 줌
// map
//map과 for-in 문 비교
var doubleNumbers:[Int] = []
for number in numbers {
    doubleNumbers.append(number*2)
} //[0,2,4,6,8]

doubleNumbers = numbers.map({ (number) in
    return number * 2
}) //[0,2,4,6,8]

//다양한 클로저 표현법으로 나타내기
var stringNumbers = numbers.map({ (number:Int) -> String in
    return "\(number)"
}) ["0", "1", "2", "3", "4"]
//매개변수 및 반환타입 생략
stringNumbers = numbers.map({return "\($0)"})
//return 키워드 생략
stringNumbers = numbers.map({"\($0)"})
//후행 클로저
stringNumbers = numbers.map{"\($0)"}

doubleNumbers는 number에 2배를 해주는 함수를 각 원소에 적용하여 반환한 컨테이너이다.

stringNumbers는 각 원소를 string형태로 바꾸어 반환해 주었다.

뒤에 들어오는 함수를 클로저를 이용해서 간단한 형태로 다양하게 표현할 수 있다.

 

filter

  • 컨테이너 내부의 값을 걸러서 추출하는 역할의 고차함수이다.
  • 즉 조건에 맞는 원소들만 걸러서 반환한다.
  • filter에 매개변수로 전달되는 함수의 반환타입은 Bool타입이여야 하며, 새 컨테이너에 포함될 항목이라면 true를 반환하고 아니라면 false를 반환하게 해줘야 한다.
//filter
let evenNumbers = numbers.filter{
    return $0 % 2 == 0
}

//filter + map
let results = numbers.filter{$0 % 2 == 0}.map{$0 + 1}
print(results)//[1, 3, 5]

evenNumbers는 numbers에서 짝수만 걸러낸 컨테이너이다.

두 번째 코드에서는 filter와 map을 한 번에 같이 쓴 모습이다.

filter함수를 통해 짝수만 걸러낸 결과에 1씩 더해서 반환한다.

 

reduce

  • 내부의 요소들을 주어진 연산을 하여 결과를 하나로 합치는 고차함수이다.
  • reduce(초깃값, 함수) 형태이다.
  • 초깃값부터 시작해서 원소를 하나씩 주어진 연산 함수를 적용한다.
//reduce
let sum = numbers.reduce(0){
    return $0 + $1
}
print(sum) //10

모든 원소의 합을 구하는 함수이다. 초깃값을 0부터 하여 0 + 1 + 2 + 3 + 4 = 10 결과를 반환한다.

댓글