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"]
  1. Int 배열을 가지고 있는 CurrentValueSubject에서 스트림이 시작합니다.
  2. 이후 map 을 만나서, CurrentValueSubject의 최신값인 currentValue에 대해 형변환을 시도합니다.