subject는 데이터가 발생하면 나중에 외부에서 넣어줄 수 있다.

서브젝트는 데이터를 넣어질 수 있고 구독 당할 수 도 있다.

//
//  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()
		let idInputText: BehaviorSubject<String> = BehaviorSubject(value: "")
		let idValid: BehaviorSubject<Bool> = BehaviorSubject(value: false)
		let pwInputText: BehaviorSubject<String> = BehaviorSubject(value: "")
		let pwValid: BehaviorSubject<Bool> = BehaviorSubject(value: false)

		
    override func viewDidLoad() {
        super.viewDidLoad()
        bindInput()
				bindOutput()
    }

    // 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 bindInput() {
        // id input +--> check valid --> bullet
        //          |
        //          +--> button enable
        //          |
        // pw input +--> check valid --> bullet

				// input : 아이디 입력, 비번 입력
				idField.rx.text.orEmpty
						.bind(to: idInputText)
						.disposed(by: disposeBag)
				pwField.rx.text.orEmpty
						.bind(to: pwInputText)
						.disposed(by: disposeBag)
		

				idInputText.map(checkEmailValid)
						.bind(to: idValid)
						.diposed(by:disposeBag) // 바로 위 코드와 같은 기능
				pwInputText.map(checkPasswordValid)
						.bind(to: pwValid)
						.diposed(by:disposeBag) 
		}

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

				pwValid.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
    }
}

ReactiveX - Subject