🐟

RxSwiftを読んだ備忘録

3 min read

RxSwiftの内部実装が気になったのでベースの部分を読んでみた自分の備忘録です
バージョン:RxSwift v6.1
リポジトリURL:https://github.com/ReactiveX/RxSwift

ObservableConvertibleType

ObservableConvertibleType.swift
/// Type that can be converted to observable sequence (`Observable<Element>`).
public protocol ObservableConvertibleType {
    /// Type of elements in sequence.
    associatedtype Element

    /// Converts `self` to `Observable` sequence.
    ///
    /// - returns: Observable sequence that represents `self`.
    func asObservable() -> Observable<Element>
}
  • ジェネリックプロトコル
  • associatedtypeとしてElementを持つ
  • このプロトコルに適合しているのは、主にObservableTypeプロトコル

ObservableType

ObservableType.swift
public protocol ObservableType: ObservableConvertibleType {
    func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element
}
  • ObservableConvertibleTypeに適合していて、subscribeメソッドを持っている
  • このプロトコルには、Observable<Element>クラスや〜Relayクラス、SubjectTypeプロトコルなど、実際にRxSwiftを利用するときによく使うObservableが適合している

ObserverType

ObserverType.swift
public protocol ObserverType {
    associatedtype Element

    func on(_ event: Event<Element>)
}
  • 監視可能なObservableに対し、監視を行うObserverについて定義しているジェネリックプロトコル
  • 引数にEvent<Element>をとるon(_ event: Event<Element>)メソッドを持っている
    • Event<Element>とは、nexterrorcompletedのイベントを定義しているenum

上記の登場人物をまとめた関係図

以下、自分用に見やすくまとめた関係図です(UMLには全く則ってないです)

なるほど、ObservableはsubscribeするときにObserverTypeを引数にとっています
ObserverTypeはイベントを流すonメソッドを持っているので、subscribe時に引数で受け取ったObserverTypeを利用してイベントを流すことができるようになっています
これにより「イベントが流れる」という処理を実現できているんですね

オペレータJustを見てみる

オペレータとはObservableを受け取った後、新たなObservableを生成して返す関数のことですが、ここではElementを受け取ってNextイベントで値を流すjustオペレータを見てみようと思います

Just.swift
extension ObservableType {
    public static func just(_ element: Element) -> Observable<Element> {
        Just(element: element)
    }
}

どうやらjustオペレータはObservableTypeのextensionとして宣言されているようです
また、justオペレータはJustクラスのインスタンスを返していることがわかります

次にJustクラスを見ていきたいと思います

Just.swift
final private class Just<Element>: Producer<Element> {
    private let element: Element
    
    init(element: Element) {
        self.element = element
    }
    
    override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {
        observer.on(.next(self.element))
        observer.on(.completed)
        return Disposables.create()
    }
}

ここに具体的にjustオペレータが行っている処理が書かれていそうですね
Justクラス自体はProducer<Element>クラスを継承していて、JustクラスのsubscribeメソッドはProducer<Element>クラスのsubscribeメソッドをoverrideしたものということがわかります
ちなみにProducer<Element>クラスはObservable<Element>クラスを継承しており、Observable<Element>クラスはObservableTypeプロトコルに適合しています

Producer<Element> → Observable<Element> → ObservableType

subscribeメソッドはObserverTypeを引数にとるメソッドで、このObserverTypeがイベントを流すonメソッドを持っているので、subscribe内では引数で受け取ったObserverTypeonメソッドを利用してイベントを流していることが読み取れます
subscribeされると流すイベントは宣言元にも書いてあるとおり、以下の通りです

        observer.on(.next(self.element))
        observer.on(.completed)

まずはnextイベントでElementをそのまま流し、次にcompletedしています
justオペレータはnextイベントでElementを流した後、completedするObservableを生成するオペレータであることを辿ることができました

今回はざっくりRxSwiftを読んでみましたが、読み違い・修正点等あればご指摘頂けると嬉しいですmm