관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 고차함수(Higher order function), Reduce 사용 방법 reduce, reduce(into:) 본문

iOS 기본 (swift)

[iOS - swift] 고차함수(Higher order function), Reduce 사용 방법 reduce, reduce(into:)

jake-kim 2022. 6. 24. 21:10

고차함수 (Higher order function)

  • 인수로 함수를 받는다 or 함수를 결과로 반환한다
func myFunc(argFunc: Void -> ()) -> someFunc {

}
  • 고차함수를 사용하면 유연하고 반복을 줄일 수 있는 장점이 존재하여, Collection 관련 연산을 할때 되도록 고차함수 사용을 지향

swift의 대표적인 고차함수

인수로 함수를 받는 형태 대표적인 4가지

  • sorted
func sorted(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> [Element]
  • filter
func filter(_ isIncluded: (Element) throws -> Bool) rethrows -> [Element]
  • map
func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]
  • reduce 
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result

Reduce

  • 내부의 콘텐츠를 하나로 합하는 기능을 실행하는 고차함수
  • reduce의 원리는 초기값을 첫번째 인수로 주고, 두번로 인수는 클로저 형태로 전달
    • 클로저의 첫번째 인수 $0는 초기값(누적값)이고, $1는 기존 배열의 element 값을 의미
  • 초기값을 지정해주는 reduce
    • 초기값을 인수로 넣고, 계산 식은 클로저 형태로 넘기는 패턴
    • $0는 누적값, $1는 배열의 element 값
let myData = [1, 2, 3, 4, 5]

let sum = myData.reduce(0) {
  print("\($0) + \($1)")
//  0 + 1
//  1 + 2
//  3 + 3
//  6 + 4
//  10 + 5
  return $0 + $1
}

// 간략하게 표현 (고차함수의 특성)
let sum2 = myData.reduce(0) { $0 + $1 }
  • 기존 형태와 달리하여 초기값을 정해줄때 사용하는 reduce(into:)
    • $0형태는 into에 들어가는 형과 동일해지고, 이 값이 누적
    • $1는 기존 배열들을 순회하여 나온 element 값
// 배열로 만들고 싶은 경우
let val = myData.reduce(into: []) {
  print("\($0), \($1)")
//  [], 1
//  [-1], 2
//  [-1, -2], 3
//  [-1, -2, -3], 4
//  [-1, -2, -3, -4], 5
  $0.append($1 * -1)
}

print(val) // [-1, -2, -3, -4, -5]
  • reduce(into:)를 사용하면 기존의 Int 배열을 String 배열로 변경도 가능
let val2 = myData.reduce(into: []) { (result: inout [String], element: Int) in
  result.append(String(element * -1))
}
print(val2) // ["-1", "-2", "-3", "-4", "-5"]

더욱 간편한 방법) into 인수 넣어줄때 캐스팅하여 타입을 알려주는 방법

let val2 = myData.reduce(into: [] as [String]) { $0.append(String($1 * -1)) }

 

Comments