RxSwiftを使ったデリゲート実装方法

RxSwiftを勉強中です。
概念から、実際の実装まで、まだまだわからないことだらけです。
わかったことから少しづつ記事にしようと思います。
間違いがありましたら、ツッコミお願いしますm(_ _)m

今回はRxSwiftでViewをタップしたらViewControllerでイベントを検知する方法を見ていきたいと思います。

UIViewの実装

//SampleView.swift
class SampleView: UIView {
    //weak var delegate: SumpleViewDelegate?
    
    // ここでは`PublishSubject`を使ってイベントを送信する
    let rx_message = PublishSubject<String>()
    
    private func didSelect() {
        rx_message.on(.Next("message"))
    }
    
    override func awakeFromNib() {
        self.userInteractionEnabled = true
    }
    
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.didSelect()
        print("touchesBegan")
    }
}

PublishSubjectクラスのインスタンスrx_messageをプロパティとして保持します。
didSelect()メソッドでrx_message.onメソッドで文字列を渡します。
touchesBegan(_:withEvent)メソッドでdidSelect()実行します。

ViewControllerの実装

//ViewController.swift
import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {
    @IBOutlet weak var sampleView: SampleView!
    let disposeBag = DisposeBag()

        sampleView.rx_message
            .subscribeNext { [ weak sampleView]  message in
                print("Did select : \(message): \(sampleView!)")
            }
            .addDisposableTo(disposeBag)
    

@IBOutlet weak var sampleView: SampleView!
SampleViewクラスのインスタンスsampleViewを保持します。

let disposeBag = DisposeBag()でストリーム終わった場合に解除するdisposeBagインスタンスを作ります

        sampleView.rx_message
            .subscribeNext { [ weak sampleView]  message in
                print("Did select : \(message): \(sampleView!)")
            }
            .addDisposableTo(disposeBag)

でsampleViewのrx_messageメソッドを購読して、イベントがあったら、sampleView、messageインスタンスをコンソールに表示するようにします。

結果

アプリを実行して、sampleViewをタップするとコンソールに以下のような文字列が出力されます

Did select : message: <SampleWebView.SampleView: 0x7fbed952dea0; frame = (107 268; 200 200); autoresize = RM+BM; layer = <CALayer: 0x7fbed95147c0>>
touchesBegan

参考