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

参考