scan은 클로저가 반환한 마지막 값과 현재 값을 클로저에 제공하여 업스트림 Publisher의 요소를 반환하는 Operator입니다.

설명이 좀 어려운데 swift 기본 함수인 reduce 와 똑같다고 보시면 돼요!

기능

구성

public func scan<T>(
  _ initialResult: T,
  _ nextPartialResult: @escaping (T, Publishers.Sequence<Elements, Failure>.Output) -> T
) -> Publishers.Sequence<[T], Failure>

nextPartialResult 의 결과값인 T를 initialResult로 취급하고 이를 Publisher가 가진 값이 모두 발행할 때까지 반복하게 됩니다.

사용

let arrayPublisher = [1,2,3,4,5].publisher

arrayPublisher.scan(0) { result, value in
  return result + value
}
.sink { value in
  print(value)
}
.store(in: &cancellables)

// 결과
1
3
6
10
15

scan의 인자에는 숫자가 들어가는데, 이것이 초기값입니다.

result에는 클로저에서 리턴하는 결과값이 들어가게 됩니다.

그래서 0+1, 1+2, 3+3, 6+4, 10+5 의 결과가 나오게 되는거죠.