RxCocoa 랑 같이 사용

//
//  ViewController.swift
//  RxSwiftIn4Hours
//
//  Created by iamchiwon on 21/12/2018.
//  Copyright © 2018 n.code. All rights reserved.
//
import RxCocoa
import RxSwift
import UIKit

class ViewController: UIViewController {
    var disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()
        bindUI()
    }

    // MARK: - IBOutler
    @IBOutlet var idField: UITextField!
    @IBOutlet var pwField: UITextField!
    @IBOutlet var loginButton: UIButton!
    @IBOutlet var idValidView: UIView!
    @IBOutlet var pwValidView: UIView!

    // MARK: - Bind UI
    private func bindUI() {
        // id input +--> check valid --> bullet
        //          |
        //          +--> button enable
        //          |
        // pw input +--> check valid --> bullet

				idField.rx.text.orEmpty
					//.filter {$0 != nil} or empty 없으면 있어야함
					//.map { $0! } 얘도
					.map {checkEmailValid}
					.subscibe(onNext: { b in
							self.idValidView.isHidden = b
					})
					.diposed(by : disposeBag)

				pwField.rx.text.orEmpty
					//.filter {$0 != nil} or empty 없으면 있어야함
					//.map { $0! } 얘도
					.map {checkPasswordValid}
					.subscibe(onNext: { b in
							self.pwValidView.isHidden = b
					})
					.diposed(by : disposeBag) 

				Observable.combineLatest(source1:idField.rx.text.orEmpty.map {checkEmailValid} 
						, source2:pwField.rx.text.orEmpty.map {checkPasswordValid},
						resultSelector: {s1 , s2 in s1 && s2})
						.subscirbe(onNext: { b in 
								self.loginButton.isEnabled = b
						})
						.diposed(by : disposeBag) 

    }
	
    // MARK: - Logic
    private func checkEmailValid(_ email: String) -> Bool {
        return email.contains("@") && email.contains(".")
    }

    private func checkPasswordValid(_ password: String) -> Bool {
        return password.count > 5
    }
}
//
//  ViewController.swift
//  RxSwiftIn4Hours
//
//  Created by iamchiwon on 21/12/2018.
//  Copyright © 2018 n.code. All rights reserved.
//
import RxCocoa
import RxSwift
import UIKit

class ViewController: UIViewController {
    var disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()
        bindUI()
    }

    // MARK: - IBOutler
    @IBOutlet var idField: UITextField!
    @IBOutlet var pwField: UITextField!
    @IBOutlet var loginButton: UIButton!
    @IBOutlet var idValidView: UIView!
    @IBOutlet var pwValidView: UIView!

    // MARK: - Bind UI
    private func bindUI() {
        // id input +--> check valid --> bullet
        //          |
        //          +--> button enable
        //          |
        // pw input +--> check valid --> bullet

				// input : 아이디 입력, 비번 입력
				let idInputOb : Observable<String> = idField.rx.text.orEmpty.asObservable()
				let pwInputOb : Observable<String> = pwField.rx.text.orEmpty.asObservable()
				
				let idValidOb = idInputOb.map(checkEmailValid)
				let pwValidOb = pwInputOb.map(checkPasswordValid)
	

				// output : 불릿,로그인 버튼 인에이블
				
				idValidOb.subscibe(onNext: { b in
								self.idValidView.isHidden = b
						})
						.diposed(by : disposeBag)

				pwValidOb..subscibe(onNext: { b in
								self.pwValidView.isHidden = b
						})
						.diposed(by : disposeBag)

				
				Observable.combineLatest(source1: idValidOb 
						, source2: pwValidOb ,
						resultSelector: { $0 && $1})
						.subscirbe(onNext: { b in 
								self.loginButton.isEnabled = b
						})
						.diposed(by : disposeBag) 
    }
	
    // MARK: - Logic
    private func checkEmailValid(_ email: String) -> Bool {
        return email.contains("@") && email.contains(".")
    }

    private func checkPasswordValid(_ password: String) -> Bool {
        return password.count > 5
    }
}