如果我想模拟RxSwift中的标准属性aBool
,我可以使用let isValid = Variable<Bool>(false)
,然后使用.value
获取内联的最后一个值,并使用.asObservable()
访问流。
不过,我想模拟一个计算属性,例如var isValid { return self.password.characters.count > 0 }
,并且能够获得内联的最后一个值以及可观察流的形式。
我想两者都能做到,这样我就能像。。。
if isValid.value { // isValid is Variable<Bool>
// ... do something ....
}
以及绑定到例如文本字段
我知道我可以写一个纯的
Observable
如下。。。var isValid: Observable<Bool> {
return self.username.asObservable().map { username in // username is Variable<String>
return username.characters.count > 0
}
}
但是我必须重构前面的例子。。。。
isValid.subscribe { isValid in
if isValid.element {
// ... do something ....
}
}.dispose(of: self.disposeBag)
那么,如何在RxSwift中表示一个计算属性,它既可以作为内联值也可以作为流使用?
最佳答案
我也遇到了同样的问题,最终得到了一个看起来不干净但有效的解决方案。我将添加一个新的var valid: Bool = false
和一个更新它的isValid
可观测的订阅
isValid.subscribe(onNext:{[弱自我]值在self中?.valid=有效})
使用这个isValid
用于绑定和订阅,而valid
用于命令式代码。
顺便说一下,你对isValid
的定义有点“不自然”,只要把它设为let isValid: Observable<Bool>
并像init
一样把它赋给isValid = username.asObservable().map({$0.characters.count > 0})
更新:
另一个解决方案是使用rxblocking,您可以使用try! isValid.toBlocking().single()
获得当前值,但我认为这是一个更糟糕的解决方案,通常不推荐使用。
关于swift - 如何模拟可访问RxSwift中最新值的计算属性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46690698/