이니셜라이저는 세 개의 인자를 받는다.
상위 Publisher가 배출한 항목에 함수를 순서대로 적용하고 함수를 연산한 후 최종 결과를 발행한다.
상위 Publisher에 흐르는 모든 값을 모아 어떠한 하나의 값을 내고 싶을 때 사용할 수 있다.
// Publishers.Reduce Publisher
Publishers.Reduce(upstream: Publishers.Sequence<[Int], Never>(sequence: [1, 2, 3]), initial: 0) { $0 + $1 }
.sink(receiveCompletion: { completion in
switch completion {
case .failure:
print("Combine Reduce Error")
case .finished:
print("Combine Reduce Finish")
}
}, receiveValue: { value in
print("Combine Reduce : \(value)")
})
.store(in: &cancellables)
// reduce Operator
Publishers.Sequence<[Int], Never>(sequence: [1, 2, 3])
.reduce(0) { $0 + $1 }
.sink(receiveCompletion: { completion in
switch completion {
case .failure:
print("Combine Reduce Error")
case .finished:
print("Combine Reduce Finish")
}
}, receiveValue: { value in
print("Combine Reduce : \(value)")
})
.store(in: &cancellables)
// Combine Reduce : 6
// Combine Reduce Finish
상위 Publisher가 1, 2, 3의 값을 차례대로 내는데, 초기 값을 0으로 하고 중첩된 이전의 값과 새로운 값에 덧셈 연산을 하는 클로저를 제공하여 요소를 모두 더한 결과를 내도록 하였다.
결과적으로 6의 값을 내고 종료한다.
Observable.from([1, 2, 3])
.reduce(0) { $0 + $1 }
.subscribe(onNext: { value in
print("RxSwift Reduce : \(value)")
}, onError: { _ in
print("RxSwift Reduce Error")
}, onCompleted: {
print("RxSwift Reduce Finish")
})
.disposed(by: disposeBag)
// RxSwift Reduce : 6
// RxSwift Reduce Finish
SignalProducer([1, 2, 3])
.reduce(0) { $0 + $1 }
.start { event in
switch event {
case let .value(value):
print("ReactiveSwift Reduce : \(value)")
case .failed:
print("ReactiveSwift Reduce Error")
case .completed:
print("ReactiveSwift Reduce Finish")
default:
break
}
}
// ReactiveSwift Reduce : 6
// ReactiveSwift Reduce Finish