티스토리 뷰
Combine type erasure, eraseToAnyPublisher 역할 및 사용이점
applebuddy 2022. 12. 11. 17:13
combine을 사용하다보면, type erasure 역할을 하는 eraseToAnyPublisher를 많이 사용하게 되는데요. 오늘은 Combine framework에서 제공하는 eraseToAnyPublisher 공식 문서를 살펴보는 시간을 가져보겠습니다.
eraseToAnyPublisher
Overview
eraseToAnyPublisher는 instance method이며, iOS13+에서 지원합니다. type erasure와 함께 publisher를 wrapping합니다. Declaration을 보면, Output, Failure 타입을 가진 AnyPublisher를 반환하고 있습니다.
eraseToAnyPublisher는 downstream subscriber에게 publisher의 상세 타입보다는 타입을 지운 상태의 AnyPublisher 인스턴스를 방출하고 싶을때 사용할 수 있습니다. 이렇게 타입을 지운 뒤 반환하는 형태는 다른 모듈과 같은 API 경계 간의 추상화를 유지할 수 있습니다.
AnyPublisher type으로 publisher event가 방출되는 경우, 이후에 Output, Failure 타입만 동일하다면, 시간이 지나도 이를 사용하는 client 들에게 큰 영향을 주지 않은 채로 해당 publisher 연산과정을 손쉽게 변경할 수 있습니다.
이어서 개발자 문서의 eraseToAnyPublisher 사용 예시 확인해보겠습니다.
아래 코드 예시는 두개의 타입이 Publisher opaque type(불투명 타입)으로 선언되어 있습니다. 차이점이라면 TypeWithSubject는 PassthroghSubject<Int, Never> Subject라는 실제 타입을 할당했고, TypeWithErasedSubject는 subject에 eraseToAnyPublisher()를 사용하여 AnyPublisher타입으로 할당했습니다.
이어서 아래에서 TypeWithSubject, TypeWithErasedSubject의 publisher를 some Publisher -> PassthroughSubject<Int, Never> 타입으로 캐스팅을 시도하고 있습니다.
결과를 보면, TypeWithSubject의 publisher는 타입 캐스팅을 성공해서 문구를 출력했지만, TypeWithErasedSubject의 publisher는 타입 캐스팅이 실패를 했습니다.
eraseToAnyPublisher를 사용할때, 사용하지 않을때 장단점
실제로 eraseToAnyPublisher를 사용하면 얻는 이점 중 하나를 예제 코드로 보도록 하겠습니다. 위 코드는 특정 API를 요청 후, WeatherResponse 타입으로 디코딩해서 Weather Output 타입 이벤트를 방출하는 코드입니다.
eraseToAnyPublisher를 사용하지 않으면 위와 같이 다양한 operator 연산과정이 적용될 경우, 매우 복잡한 타입을 반환하게 됩니다. 이대로 사용할수도 있겠지만, 외부에서 해당 메서드의 연산과정이 모두 노출되며, 시간이 지나서 fetchWeather 메서드의 중간 연산과정이 변경된다면, 해당 메서드를 기존에 사용하던 모든 코드에도 영향을 미칠 수 있습니다.
eraseToAnyPublisher를 사용한 모습입니다. 이제 외부에서는 해당 메서드를 사용할때 실질적으로 사용되는 Output, Error 타입만 확인이 가능합니다. 즉, 외부에는 중간 연산과정이 노출되지 않습니다.
또한, fetchWeather의 중간 연산과정이 이후에 변경되더라도 Output, Failure 타입만 유지만다면, 외부에서는 추상화된 AnyPublisher 타입을 사용하기 때문에 해당 메서드를 사용한 외부 코드의 영향을 줄일 수 있습니다.
지금까지 publisher type erasure, AnyPublisher 주제로 다뤄봤습니다. 의견, 질문 환영합니다. 감사합니다. 😁
'iOS 개발 > SwiftUI, Combine' 카테고리의 다른 글
iOS Combine merge(with:) operator 특징 및 실 사용방법 (0) | 2023.01.15 |
---|---|
iOS Font Asset 추가 및 SwiftUI Text View 폰트 적용 방법 (0) | 2023.01.10 |
iOS Combine, Publisher로 UIButton, UIView 이벤트 처리방법 (1) | 2022.11.14 |
TCA, ViewStore Action 전송 간 Effect 구독과 메모리해제 동작방식 (0) | 2022.10.26 |
SwiftUI, ViewModifier로 Custom NavigationBar 만드는 방법 (0) | 2022.10.13 |
- Total
- Today
- Yesterday
- swift문제
- 프로토콜
- 스위프트
- Collection
- createML
- swift string
- 백준swift
- 부스트코스
- 컬렉션
- Protocol
- 프로그래머스swift
- 알고리즘문제
- swift
- SwiftUI
- swift 기초
- swift 문자열
- 프로그래머스
- swift알고리즘
- 자연어처리
- publisher
- swift언어
- Swift 알고리즘
- ios
- 김프매매
- 개발자문서
- CoreML
- swift reduce
- 알고리즘
- 백준알고리즘
- uikit
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |