2

我对 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 其他可能派上用场的场景是当我想对用户输入(只有字母或只有数字)有一些限制时,或者我想以一种奇特的方式格式化输入。

4

0 回答 0