제라스의 iOS 공부/Swift 문법
[Swift 문법] 고차함수 - reduce
Xerath(제라스)
2023. 8. 19. 07:05
728x90
반응형
reduce를 활용하면 주어진 콜렉션 타입 내 모든 요소에 대해 연이은 작용을 할 수 있다.
뭔 소리야...?
그냥 예를 들면,
1. 배열 내 모든 값을 더하고 싶을 때
2. 배열 내 모든 값을 곱하고 싶을 때 등등
코드로 보자.
let nums = [1,2,3,4,5,6,7,8,9,10]
// 이런 숫자 list 내 모든 원소를 더하고자 하면 보통 for문을 써서 모든 값을 더한다.
var sum = 0
for num in nums {
sum += num
}
print(sum)
하지만 이런 for문 말고 reduce를 쓰면 원큐에 모든 값에 대한 작업을 적용할 수 있다.
방법1.
let numberArray = [1,2,3,4,5,6,7,8,9,10]
let sum = numberArray.reduce(0, { (first: Int, second: Int) -> Int in
return first + second
})
print(sum)
이렇게 매개변수, 반환 타입, return을 사용한 것도 괜찮지만 다음처럼 모두 생략하는 방식으로도 가능하다
방법2.
let numberArray = [1,2,3,4,5,6,7,8,9,10]
let sum = numberArray.reduce(0) { $0 + $1 }
print(sum)
사실 더 간단하게는, 다음처럼 딱 +나 *와 같은 계산 operator만 주어도 된다.
방법3.
let numberArray = [1,2,3,4,5,6,7,8,9,10]
let sum = numberArray.reduce(1, +)
print(sum)
이런 다양한 표현이 있는데 나는 개인적으로 방법2를 가장 많이 쓰게 될 것 같다.
Dictionary 타입에서의 reduce
더 공부하다보니 Dictionary 타입에서는 어떻게 쓰는지도 궁금했다.
Dictionary는 조금 복잡하지만 다음과 같은 방식으로 value에 접근해서 reducing을 진행한다.
let dictionary: [String: Int] = ["a": 1, "b": 2, "c": 3]
let sum = dictionary.reduce(0) { (result, keyValue) in
return result + keyValue.value
}
print(sum)
혹은 다음과 같은 방식으로 주어진 배열을 그룹핑할 수도 있다.
import UIKit
struct Friend : Hashable {
var name: String
var age: Int
}
let myFriends = [
Friend(name: "철수", age: 10),
Friend(name: "영희", age: 20),
Friend(name: "찰리", age: 20),
Friend(name: "레이첼", age: 30),
Friend(name: "수잔", age: 30)
]
let totalAge = myFriends.reduce(0) { partialResult, aFriend in
return partialResult + aFriend.age
}
let groupedFriends = myFriends.reduce(into: [Int: [Friend]]()) { partialResult, aFriend in
partialResult[aFriend.age, default: []].append(aFriend)
}
print(groupedFriends)
728x90
반응형