Transform 을 이용한 입출력

Input Output Protocol

protocol ViewModelType {
		associatedtype Input
		associatedtype Output

		var disposeBag: DisposeBag { get set }
		
		func transform(input: Input) -> Output
}

ViewModel 에서는 ViewModelType 을 받아오고, 그에 관련된 것들 선언

import Foundation

import RxSwift
import RxCocoa

final class ViewModel: ViewModelType {
		var disposeBag = DisposeBag()

		struct Input {
				let touch: ControlEvent<Void>
		}

		struct Output {
				let text: Driver<Void>
		}

		func transform(input: Input) -> Output {
				let text = input.touch
						.map {
								print("touched")
						}
						.asDriver(onErrorJustReturn: "")
				return Output(text: text)
		}
}
import UIKit

import RxSwift
import RxCocoa

final class ViewController: UIViewController {
		
		private let button = UIButton()
		private let label = UILabel()

		private let viewModel = ViewModel()
		private let disposeBag = DisposeBag()

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

		private func bindViewModel() {
				let input = viewModel.Input(touch: button.rx.tap)
				let output = viewModel.transform(input: input)
				output.text
						.drive(label.rx.text)
						.disposed(by: disposeBag)
		}
}

이렇게 되면 ViewController 가 온전히 View 의 역할을 하게 됨

ViewModel 내부에 Input, Output 을 만들고 변수로 노출