Notice
Recent Posts
Recent Comments
Link
관리 메뉴

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

[iOS - SwiftUI] Combine Reducing 연산자 (collect, ignoreOutput, reduce, tryReduce) 본문

iOS Combine (SwiftUI)

[iOS - SwiftUI] Combine Reducing 연산자 (collect, ignoreOutput, reduce, tryReduce)

jake-kim 2022. 11. 9. 23:30

목차) Combine - 목차 링크

Reduce

  • 배열과 같은 Sequence형태를 하나의 값이나 축소 시키는 연산자
  • collect 연산자
    • collect(n)이면 n 만큼 묶어서 방출
(0...10).publisher
  .collect(5)
  .sink { print($0) }
/*
 [0, 1, 2, 3, 4]
 [5, 6, 7, 8, 9]
 [10]
 */
  • ignoreOutput()
    • 값이 방출되는 값은 모두 무시하고 completion의 failure만 방출
struct NoZeroValuesAllowedError: Error {}
let numbers = [1, 2, 3, 4, 5, 0, 6, 7, 8, 9]
numbers.publisher
  .tryFilter({ anInt in
    guard anInt != 0 else { throw NoZeroValuesAllowedError() }
    return anInt < 20
  })
  .ignoreOutput()
  .sink(
    receiveCompletion: { print("completion: \($0)") },
    receiveValue: { print("value \($0)") }
  )
// completion: failure(.NoZeroValuesAllowedError())
  • reduce(_:_:)
    • 첫번째 인수에는 초기값을 넣고, 두번째에는 연산 ($0, $1) 결과를 리턴
    • $0는 누적값, $1는 배열을 순회하는 값
print("-------")
[1,2,3,4].publisher
  .reduce(0, { $0 + $1 })
  .sink { print($0) }
// 10
  • tryReduce(_:)
    • 위 reduce의 기능을하면서 동시에 예외를 던지고 싶은 경우 throw로 예외 던지기가 가능
    • 처리는 catch 연산자 사용
struct DivisionByZero: Error {}
[1,2,3,4,0].publisher
  .tryReduce(0, {
    guard $1 != 0 else { throw DivisionByZero() }
    return $0 / $1
  })
  .catch { _ in Just(-1) }
  .sink { print($0) }
// -1
Comments