読者です 読者をやめる 読者になる 読者になる

しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

RxSwiftをインストールして簡単に使ってみる

RxSwiftの簡単な機能を使ってみました。

インストール

CocoaPodsで下の3つをインストールします。

pod 'RxSwift', '~> 2.0.0-alpha'
pod 'RxCocoa', '~> 2.0.0-alpha'
pod 'RxBlocking', '~> 2.0.0-alpha'

テキストフィールドの入力イベントのサンプル

tf1とtf2の合計がtf3に反映されるサンプルを作ってみました。

import RxSwift
import RxCocoa

let tf1 = UITextField(frame: CGRect(x: 100, y: 100, width: 40, height: 20))
let tf2 = UITextField(frame: CGRect(x: 100, y: 150, width: 40, height: 20))
let tf3 = UITextField(frame: CGRect(x: 100, y: 200, width: 40, height: 20))
tf1.borderStyle = .Line
tf2.borderStyle = .Line
tf3.borderStyle = .Line
view.addSubview(tf1)
view.addSubview(tf2)
view.addSubview(tf3)

Observable.combineLatest(tf1.rx_text, tf2.rx_text) { (a: String, b: String) -> (Int, Int) in
    return (Int(a) ?? 0, Int(b) ?? 0)
    }
    .map { (a, b) in
        return "\(a + b)"
}.bindTo(tf3.rx_text)

動かした所、自動でtf3に変更が反映されました。

f:id:llcc:20151003192435p:plain

tf3をUILabelに変えても問題なく動きました。

let tf1 = UITextField(frame: CGRect(x: 100, y: 100, width: 40, height: 20))
let tf2 = UITextField(frame: CGRect(x: 100, y: 150, width: 40, height: 20))
let lb = UILabel(frame: CGRect(x: 100, y: 200, width: 40, height: 20))
tf1.borderStyle = .Line
tf2.borderStyle = .Line
view.addSubview(tf1)
view.addSubview(tf2)
view.addSubview(lb)

combineLatest(tf1.rx_text, tf2.rx_text) { (a: String, b: String) -> (Int, Int) in
    return (Int(a) ?? 0, Int(b) ?? 0)
    }
    .map { (a, b) in
        return "\(a + b)"
}.catchError({ value -> Observable<String> in
    print(1)
    return Observable<String>()
}).bindTo(lb.rx_text)

条件によってフィルタリングをする

filterを使うと特定の条件だけ値を反映させる事ができます。

let tf = UITextField(frame: CGRect(x: 100, y: 100, width: 40, height: 20))
let lb = UILabel(frame: CGRect(x: 100, y: 200, width: 40, height: 20))
tf.borderStyle = .Line
view.addSubview(tf)
view.addSubview(lb)

tf1.rx_text.map { (text: String) -> String in text }
            .filter { value -> Bool in Int(value) != nil }.bindTo(lb.rx_text)

ボタンのタップイベント

ボタンがタップされた時にUILabelの中身が変わるサンプルを書いてみました。

let btn = UIButton(frame: CGRect(x: 100, y: 150, width: 200, height: 44))
btn.setTitle("Tap", forState: .Normal)
btn.backgroundColor = UIColor.grayColor()
view.addSubview(btn)
let lb = UILabel(frame: CGRect(x: 100, y: 200, width: 40, height: 20))
view.addSubview(lb)

btn.rx_tap.subscribeNext { value -> Void in
    lb.text = "AAA"
}