Transforming Operators

<aside> ⭐ Observable을 변형하는 Operator 자세히 설명하면 observable로부터 방출된 값들을 다른 형태나 변형된 값으로 변화를 주고 방출하는 오퍼레이터

</aside>

1. map

원본 옵저버블이 방출하는 요소를 대상으로 함수를 실행하고 결과를 새로운 옵저버블로 리턴

아래는 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
}

2. flatMap

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
}

TransformSelector로 바뀜

⇒ 잘은 모르겠지만 계속 아까처럼 결과값을 도출하는게 아닌 옵저버블을 리턴하는 것을 볼 수 있어요!

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은 이벤트의 값을 바꾸지만,