-
[Swift] 15. Higher-order function 고차함수 기초 (map, filter, reduce)Programming Language/Swift 2022. 6. 5. 09:06
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)
- 출처
반응형'Programming Language > Swift' 카테고리의 다른 글
[Swift] 17. Subscript - 서브스크립트 (0) 2022.06.12 [Swift] 16. Monad - 모나드 (0) 2022.06.05 [Swift] 14. Optional Chaining - 옵셔널 체이닝 (0) 2022.06.05 [Swift] 13. Closure - 클로저 (0) 2022.06.05 [Swift] 12. 접근 제어 (0) 2022.05.23