我对 FRP 很陌生,并决定开始使用 Bond 和 ReactiveKit,因为它看起来足够轻量级,可以开始逐渐将它应用到我的应用程序和我的头脑中。
我有一个设置,我有一个视图,它有一个可观察的State
,我有一个视图模型,它具有另一个类型的可观察属性State
。我希望我的视图变得乏味且不了解语义,因此我希望我的视图模型能够验证状态、转换状态并将其发送回视图。
该视图包含几个文本字段和一个分段控件。当分段控件为0
时,我只希望第一个文本字段可见,否则 - 两个字段。每当用户输入某些内容或点击分段控件时,都会更新可观察状态对象。这是State
结构:
enum ValueType {
case text
case number
}
struct State {
var name: String?
var unit: String?
var valueType: ValueType = .text
var showsUnitTextField: Bool = true
}
这是我能想到的最好的:
查看型号:
override init() {
super.init()
self.bind()
}
let inputState: Observable<State> = Observable<State>(State())
var outputState: Observable<State> = Observable<State>(State())
private func bind() {
inputState.map(self.sanitizeState(_:)).bind(to: outputState)
}
private func sanitizeState(_ state: State) -> State {
var newState = state
newState.showsUnitTextField = state.valueType == .number
return newState
}
视图控制器:
private func bind() {
myView.reactive.state.bind(to: viewModel.inputState)
viewModel.outputState.bind(to: myView.reactive.state)
}
基本上我有两个可观察对象,一个接收更新,另一个将转换后的值发送回视图。这个解决方案似乎引入了一个沉重的样板,我正在寻找一个更好的样板。有人有什么主意吗?
PS 其他可能派上用场的场景是当我想对用户输入(只有字母或只有数字)有一些限制时,或者我想以一种奇特的方式格式化输入。