map은 업스트림 퍼블리셔의 모든 값의 타입을 변환시키는 Operator입니다.
public func map<T>(
_ transform: @escaping (Self.Output) -> T
) -> Publishers.Map<Self, T>
transform 클로저는 업스트림 Publisher의 Output을 인자로 가지고 있어요.
이 클로저에서 원하는 형태의 타입으로 리턴시켜주면, Publishers.Map<Self, T> 타입으로 Publisher가 변환됩니다.
Publishers.Map은 다음 구조를 가지고 있어요.
extension Publishers {
public struct Map<Upstream, Output> : Publisher where Upstream : Publisher {
public typealias Failure = Upstream.Failure
public let upstream: Upstream
public let transform: (Upstream.Output) -> Output
public init(upstream: Upstream, transform: @escaping (Upstream.Output) -> Output)
public func receive<S>(subscriber: S) where Output == S.Input, S : Subscriber, Upstream.Failure == S.Failure
}
...
결국 Publishers.Map<Self, T> 는 Publishers.Map<Upstream, Ouput> 이고,
receive 메서드에서 subscriber을 전달받을 때에는 Map의 Output이 Subscriber의 Input, 그리고 Upstream의 Failure이 Subscriber의 Failure이 되는군요.
let subject = CurrentValueSubject<[Int], Never>([1,2,3,4,5])
subject // 1
.map { currentValue in // 2
return currentValue.map { String($0) } // 3
}
.sink { value in
print(value)
}
.store(in: &cancellables)
// 결과
["1", "2", "3", "4", "5"]