Swift 정리 - 15. 고차함수(맵, 필터, 리듀스


Swift의 고차함수 map, filter, reduce를 알아보자.


Swift를 사용하는 개발자라면 고차 함수는 꼭 알고 있어야 한다. Swift는 함수를 일급 객체로 취급하기 때문에, 함수를 다른 함수의 전달인자로 취급할 수 있다.

Higher-order function은 인자로 하나 이상의 함수를 받거나 함수를 리턴하는 함수다.

map

map은 컨테이너가 담고 있는 모든 요소에 자신이 받은 함수를 적용한 뒤 업데이트 된 컨테이너를 반환한다. 즉 기존 데이터를 변형하는데 많이 사용한다. 기존 컨테이너의 값은 변하지 않고, 값이 업데이트된 새로운 컨테이너가 반환된다.

Swift에서 map은 배열, 딕셔너리, 집합, 옵셔널 등에 사용할 수 있다. Sequence, Collection 프로토콜을 따르는 타입과 옵셔널은 모두 map을 사용할 수 있다.

map은 컨테이너 내의 모든 요소에 한 번씩 접근해서 함수를 수행한다는 점에서 for-in 문과 비슷하다. 하지만 코드의 재사용, 컴파일러 최적화 면에서는 차이가 있다. 또한 멀티 스레드 환경에서 컨테이너 값이 한 스레드에서 변경될 때 다른 스레드에서도 동시에 값이 변경되려고 할 때 예상하지 못한 결과가 발생하는 것을 방지할 수도 있다.

// 1
let coins = [1, 5, 2, 10, 6]

// 2
var coinsWithCurrency: [String] = []
for coin in coins {
    coinsWithCurrency.append("\(coin)$")
}
print(coinsWithCurrency)

// 3
let coinsWithCurrencyUsingMap = coins.map { (coin) -> String in
    "\(coin)$"
}
print(coinsWithCurrencyUsingMap)

// 4
let coinsWithCurrencyUsingMap_shortSyntax = coins.map { "\($0)$" }
print(coinsWithCurrencyUsingMap_shortSyntax)

map을 사용하면 코드가 간결해질 뿐만 아니라 새로운 배열을 위해 처음에 빈 배열을 따로 만드는 작업도 필요가 없다.

filter

filter는 컨테이너의 모든 요소를 돌면서 filter의 body의 조건을 만족하는 요소들만을 담은 컨테이너를 반환한다. 즉 컨테이너 내부의 값을 거르는 고차함수다.

// 1
let coins = [1, 5, 2, 10, 6, 2, 7, 4, 10, 15]

// 2
let coinsWithValueLessThanSix = coins.filter { (coin) -> Bool in
    coin < 6
}
print(coinsWithValueLessThanSix)

// 3
let coinsWithValueLessThanSixShortSyntax = coins.filter { $0 < 6 }
print(coinsWithValueLessThanSixShortSyntax)

reduce

reduce는 컨테이너 내의 모든 요소들을 돌면서 모든 요소들의 결합된 값을 리턴한다. 즉 컨테이너 내부의 콘텐츠를 하나로 합치는 고차함수다.

func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result

좀 더 간단히 표현하면 reduce(초기result, (현재result, 현재element) -> 최종result)다.


// 1
let coins = [1, 5, 2, 10, 6, 2, 7, 4, 10, 15]

// 2
let sumOfCoins = coins.reduce(0) { (result, coin) -> Int in
    result + coin
}
print(sumOfCoins)

// 3
let sumOfCoinsShortSyntax = coins.reduce(0, { $0 + $1 })
print(sumOfCoinsShortSyntax)
  • 출처
  • https://levelup.gitconnected.com/higher-order-functions-in-swift-35861620ad1