이재용의 iOS

AnyPublisher

2024년 4월 12일 • ☕️ 1 min read

정의

프로토콜 Publisher을 준수하는 어떤 Publisher를 추상화하여 해당 Publisher의 구체 타입을 소거하는 Publisher

특징

  • Publisher 프로토콜을 준수하기만 하면 어떤 타입이든 상관없이 소거 가능
  • Publisher 프로토콜의 모든 기능 수행 가능

예시

func fetchData() -> AnyPublisher<Data, Error> {
  URLSession.shared.dataTaskPublisher(for: URL(string: "https://example.com")!)
      .map { $0.data }
      .mapError { $0 as Error }
      .eraseToAnyPublisher() // URLSession의 Publisher를 AnyPublisher로 타입 소거
}

fetchData()
  .sink { completion in
    switch completion {
    case .finished:
      print("finished")
    case .failure(let error):
      print("error: \(error)")
    }
  } receiveValue: { value in
    print(value)
  }
  .store(in: &cancellables)

URLSession의 dataTaskPublisher를 사용하면 URLSession.DataTaskPublisher 타입의 Publisher가 리턴된다. 타입소거 없이 그대로 사용하는 방법도 있지만, 이후 다른 Publisher와 상호작용 해야하는 상황이 발생한다면 구체 타입을 더 이상 사용할 수 없으므로 AnyPublisher로 추상화 시켜야 한다.