제라스의 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
반응형