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)
}
}
ControlEvent 가 뭔데..?asDriver 가 뭔데..?Relay 가 뭔데..?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 의 역할을 하게 됨