<aside> ⭐ Observable을 변형하는 Operator 자세히 설명하면 observable로부터 방출된 값들을 다른 형태나 변형된 값으로 변화를 주고 방출하는 오퍼레이터
</aside>
원본 옵저버블이 방출하는 요소를 대상으로 함수를 실행하고 결과를 새로운 옵저버블로 리턴
아래는 map의 소스코드인데, 조금 더 깊게 들어가면
public func map<Result>(_ transform: @escaping (Element) throws -> Result)
-> Observable<Result> {
Map(source: self.asObservable(), transform: transform)
}
내부가 이런식으로 선언된 것을 볼 수 있다.
**Transform
**을 주목해서 본다면 (SourceType) throws -> ResultType
내용 그대로observable 값에서 새로운 값을 리턴하는 것을 볼 수 있따.
typealias Transform = (SourceType) throws -> ResultType
private let source: Observable<SourceType>
private let transform: Transform
init(source: Observable<SourceType>, transform: @escaping Transform) {
self.source = source
self.transform = transform
}
Observable에 의해 방출된 항목을 Observable로 변환한 다음 그 방출을 단일 Observable로 평면화한다.
??? 이게 뭔 개소리야..
라고 하기전에 일단 하던대로 내부 코드를 한번 살펴보자
map과 상당히 비슷한 모습을 하고 있는 것을 볼 수 있는데 한 가지 다른 부분은
public func flatMap<Source: ObservableConvertibleType>(_ selector: @escaping (Element) throws -> Source)
-> Observable<Source.Element> {
return FlatMap(source: self.asObservable(), selector: selector)
}
private let source: Observable<SourceElement>
private let selector: Selector
init(source: Observable<SourceElement>, selector: @escaping Selector) {
self.source = source
self.selector = selector
}
Transform
이 Selector
로 바뀜
⇒ 잘은 모르겠지만 계속 아까처럼 결과값을 도출하는게 아닌 옵저버블을 리턴하는 것을 볼 수 있어요!
typealias Selector = (SourceElement) throws -> SourceSequence
private let source: Observable<SourceElement>
private let selector: Selector
init(source: Observable<SourceElement>, selector: @escaping Selector) {
self.source = source
self.selector = selector
}
바로 이 차이점인데요 map은 이벤트의 값을 바꾸지만,