관리 메뉴

사과하는 제라스

[Swift 문법] 고차함수 - reduce 본문

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