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

RxSwiftを試してみた

最近話題のRxSwiftで残り文字数が表示されるTextFieldを実装してみました。

 

普通に実装すると少し面倒くさいらしいです。(iOS で文字数制限つきのテキストフィールドをちゃんと作るのは難しいという話 - blog.niw.at

 

f:id:icchii0618:20151228233228g:plain

 

また、「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)
    
}

  本来なら面倒な実装を宣言的に少ないコードで書けている気がしますね。