RxSwiftでVoidをonNextした時、subscribeが処理されなかった


とある処理

RxSwiftを正しく使ってないとかそういうことは置いておいて、下記のような記述があった。

class HogeView: UIView {
    private subject: PublishSubject<Void> = PublishSubject()
    var observer: Observable<Void> { return subject }

    @IBOutlet func onTap(_ sender: UIButton) {
        subject.onNext(())
    }
}

class HogeViewController: UIViewController {
    @IBOutlet weak var hogeView: HogeView!

    override func viewDidLoad() {
        super.viewDidLoad()
        hogeView.observer.subscribe {
            // 処理
        }
    }
}

このhogeView.observer.subscribeの処理部分がボタンをタップしても動かず、なんでだろうと悩んだ。

結論

subscribeのevent引数を省略していたことで、今回の問題が起きていた。
event.elementはどうせVoidだしボタンのタップだけ検知できればいいから、eventいらないと記述を忘れていた結果、

public func subscribe(onCompleted: (() -> Void)? = nil, onError: ((Error) -> Void)? = nil) -> RxSwift.Disposable

が推論として呼ばれるようになっていた。

下記記述にしたことで、意図通り動いた。

class HogeView: UIView {
    private subject: PublishSubject<Void> = PublishSubject()
    var observer: Observable<Void> { return subject }

    @IBOutlet func onTap(_ sender: UIButton) {
        subject.onNext(())
    }
}

class HogeViewController: UIViewController {
    @IBOutlet weak var hogeView: HogeView!

    override func viewDidLoad() {
        super.viewDidLoad()
        hogeView.observer.subscribe { (_) in // event引数を省略しない
            // 処理
        }
    }
}

備考

debug オペレータを使ってデバッグしろとアドバイス貰って、onNextが正常に飛んできているのを確認できたので、subscribeに問題あることがわかり解決できた。

初歩的なミスだった。
備忘録がてら記述しておく。