RDXVM 是另一个受 Redux 和 ReactorKit 启发的 MVVM 实现。
要运行示例项目,请克隆 repo,然后首先从 Example 目录运行 pod install
。
RDXVM 可以通过 CocoaPods 获得。 要安装它,只需将以下行添加到您的 Podfile 中
pod 'RDXVM'
ViewModel 需要 action、mutation、event 和 state 的自定义类型来继承并创建实例。
enum Action {
case add(Int)
case subtract(Int)
}
enum Mutation {
case add(Int)
case calculating(Bool)
}
enum Event {
case notSupported
}
struct State {
var sum = 0
var calculating = false
}
您可以使用这些类型继承 ViewModel,并且必须重写 react(action:state:)
和 reduce(mutation:state:)
方法。 在 react(action:state:)
中,您应该返回一个 Reaction 的 observable。
class CalcViewModel: ViewModel<Action, Mutation, State, Event> {
init(state: State = State()) {
super.init(state: state)
}
override func react(action: Action, state: State) -> Observable<Reaction> {
switch action {
case .add(let num):
return .of(.mutation(.calculating(true)),
.mutation(.add(num)),
.mutation(.calculating(false)))
case .subtract:
return .just(.event(.notSupported))
}
}
override func reduce(mutation: Mutation, state: inout State) {
switch mutation {
case let .add(let num):
state.sum += num
case let .calculating(let calculating):
state.calculating = calculating
}
}
}
let vm = CalcViewModel<Action, Mutation, Event, State>()
将 action 发送到 ViewModel,并从 ViewModel 获取输出(event、error、state)。
addButton.rx.tap.map { Action.add(3) }
.bind(to: vm.action)
.disposed(by: dbag)
vm.event
.emit()
.disposed(by: dbag)
vm.error
.emit()
.disposed(by: dbag)
vm.state
.drive()
.disposed(by: dbag)
您可以获取状态的当前值或状态的属性。
// current state itself
vm.$state
// current value of state's property
vm.$state.sum
// '$' can be omitted to get prperty value of the state.
vm.state.sum
您可以将 @Drived
属性应用于状态的属性,这样您就可以直接驱动该属性而不是状态本身。
struct State {
@Drived var sum = 0
@Drived var calculating = false
}
vm.state.$sum.drive()
vm.state.$calculating.drive()
skyofdwarf, skyofdwarf@gmail.com
RDXVM 在 MIT 许可下可用。 有关更多信息,请参见 LICENSE 文件。