RxSwiftを試してみた
最近話題のRxSwiftで残り文字数が表示されるTextFieldを実装してみました。
普通に実装すると少し面倒くさいらしいです。(iOS で文字数制限つきのテキストフィールドをちゃんと作るのは難しいという話 - blog.niw.at)
また、「RxはFRPを実現するもの」だとか 「LINQのシーケンス処理をベースに、非同期イベント処理のリアクティブな記述をpush-base、pull-baseの両面からサポートするもの」だとかググれば色々な説明が出てきますがRxがどんなものなのかという個人的な見解はまた別のエントリで紹介できればと思います。
それでは実装に移りたいと思います。
まず、cocoa podsでRxSwiftとRxCocoaをインストールします
pod 'RxSwift', '~>2.0.0-beta' pod 'RxCocoa', '~>2.0.0-beta'
こんな感じで必要なものをimportしたり定義したりして、
import UIKit import RxSwift import RxCocoa class ViewController: UIViewController { @IBOutlet weak var countLabel: UILabel! @IBOutlet weak var textField: UITextField! let disposeBag = DisposeBag() let maxStringCount = 30 override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. countLabel.text = "残り\(maxStringCount)文字" self.subscribe() }
これが残り文字数を反映させるfunctionです
private func subscribe() { self.textField.rx_text .map { text in text.utf16.count } .subscribeNext{ textCount in self.countLabel.text = "残り\(self.maxStringCount - textCount)文字" } .addDisposableTo(disposeBag) }
本来なら面倒な実装を宣言的に少ないコードで書けている気がしますね。