我对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)
}
基本上我有两个observable,一个接收更新,另一个将转换后的值发送回视图。这个解决方案似乎引入了沉重的样板,我正在寻找一个更好的解决方案。有没有人有任何想法?
P.S。其他可能派上用场的情况是我想对用户输入有一些约束(只有字母或只有数字),或者我想以一种奇特的方式格式化输入。