Swift🐤

swift) reduce 메소드

성실농장주 2024. 3. 17. 14:36

reduce 메소드는 컨테이너의 요소들을 병합하는 제네릭 메소드입니다.

reduce 함수의 시그니쳐

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

 

제네릭 메소드이므로 다양한 타입으로 연산이 진행됩니다. 

initialResult

첫번째 파라미터 initialResult은 변수의 타인은 Result이고 이것은 컨테이너의 요소(element)의 타입입니다. 

nextPartialResult

두번째 파라미터 nextPartialResult는 요소들을 어떻게 병합할지 정의하는 파라미터입니다.

 

해당 파라미터의 타입은 클로져이고 해당 클로져의 이름이 없는 파라미터들은  각각 Result와 Element 타입을 가지게 됩니다. 

 

컨테이너의 왼쪽 요소부터 차례대로 병합을 진행하는데 클로져의 첫번째 파라미터(Result)는 병합을 진행하면서 누적된 값을 저장하고 클로져의 두번째 파라미터(element)는 반복 중 현재 요소를 저장합니다. 해당 클로져는 각 반복마다 수행된 연산의 값을 Result 형태로 반환합니다.

 

throws 키워드는 함수나 메소드에서 에러를 처리하는 키워드입니다.

그 말은 즉! throws가 있을 경우 해당 함수나 메소드 혹은 클로져는 에러가 발생할 수 있다는것을 암시합니다.

이때 nextPartialResult 클로져 내부에서 발생할 수 있는 에러를 throws를 통해 호출자에게 해당 에러를 전달 할 수 있습니다.

병합의 과정이 끝나면 끝나면 해당 값(Result타입)

reduce의 쓰임

다른 개발자들은 reduce를 주로 리스트에 존재하는 숫자들의 합 혹은 뺄셈 또는 문자열의 병합을 하기 위해 reduce메소드를 사용합니다.

문자열 병합

let str = "hello"
print(str) //hello

//map 메소드를 이용해 문자열의 요소들을 각각 배열의 요소에 할당
let list = str.map({String($0)})
print(list) // ["h", "e", "l", "l", "o"]

//문자열 병합
//reduce 메소드의 첫번째 파라미터를 ""로 초기화
let combinedList = list.reduce(""){$0 + $1}
print(combinedList) //hello

숫자 병합(덧셈)

let list = [1,2,3,4]
print(list) //[1, 2, 3, 4]

//문자열 병합
let combinedList = list.reduce(0){$0 + $1}
print(combinedList) //10

숫자 병합(뺄셈)

let list = [1,2,3,4]
print(list) //[1, 2, 3, 4]

//문자열 병합
let combinedList = list.reduce(0){$0 - $1}
print(combinedList) //-10

 

처음보는 타입 Result는 뭐지?

 매번 특정 함수를 함수를 사용하려고 할때 자동완성 기능 아래 관련 메소드의 설명이 뜨게 됩니다.

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

 요런 형식으로 뜨게 되었습니다.

 reduce의 관련 설명을 보던 와중 뜬금없이 Result가 보였습니다.

 처음에 Result라는 타입을 보고 내가 알지 못했던 무슨 새로운 타입인가 했지만 

 "제네릭 타입의 이름"이였던것을 알게 되었다.

 

 추가 설명에 제네릭 함수를 선언할때 명명한 제네릭 타입의 이름이 뜨게 됩니다. 위에 경우 제네릭 타입의 이름은 Result로 명명되어 있습니다.

 

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

 

 [throws와 rethrows은 뭐야?]

throws 키워드 같은 경우에는 error handling을 위한 키워드입니다. 

함수 혹은 메소드 내에서 에러가 발생하게 된다면 특정 값을 호출자에게 전달해주는 키워드입니다.

 

rethrows 키워드는 throws를 가지고 있는 함수, 메소드, 클로저를 인자로 받는 함수에서 사용됩니다. 이 키워드는 해당 함수가 받은 throws 함수, 메소드, 클로저의 에러를 그대로 호출자에게 전달함을 나타냅니다.

 

즉, rethrows의 사용 전제조건은 rethrows 키워드는 함수가 내부에서 에러를 던질 수 있는 throws 함수를 파라미터로 받아들일 때 사용됩니다.