2024년 4월 12일 • ☕️ 1 min read
프로토콜 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로 추상화 시켜야 한다.