面白きことは良きことなり

拙く未熟なiOSエンジニアの備忘録と戯言

RxSwift+MVVMで出てくるサイトのコードの備忘録

RxSwift+MVVMで上位に引っかかるRealm

academy.realm.io

RxSwiftとMVVMを勉強しようとした際、上記サイトが上位にくるものの、記載されているコードを今写経してもエラーがでるのみで正常に動かなかった。
調べたり試行錯誤して動くようにできたので記録しておく。

というかほぼStackOverflow先生に答えがあったようなものだった。

動作環境

  • Xcode8.3.3
  • RxSwift 3.6.1

コード

// View(ViewController)
import UIKit
import RxCocoa
import RxSwift

class LoginViewController: UIViewController {

    @IBOutlet var usernameTextFiled: UITextField!
    @IBOutlet var passwordTextFiled: UITextField!
    @IBOutlet var confirmButton: UIButton!
    
    var viewModel = LoginViewModel()
    let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        usernameTextFiled.rx.text.orEmpty.bind(to: viewModel.username).disposed(by: disposeBag)
        passwordTextFiled.rx.text.orEmpty.bind(to: viewModel.password).disposed(by: disposeBag)
        
        viewModel.isValid.map { $0 }.bind(to: confirmButton.rx.isEnabled).disposed(by: disposeBag)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}
// ViewModel
import Foundation
import RxSwift

struct LoginViewModel {

    var username = Variable<String>("")
    var password = Variable<String>("")

    var isValid: Observable<Bool> {
        return Observable.combineLatest(self.username.asObservable(), self.password.asObservable()) { (username, password) in
            return username.characters.count > 0 && password.characters.count > 0
        }
    }
}

Swift2からSwift3への移行期にもよくあったけど、RxSwiftも古い情報がひっかかりやすく、最新のVersionでの書き方がわからず四苦八苦する状態に陥っている。

参考サイト

ios - UITextField binding to ViewModel with RxSwift - Stack Overflow