如果我想模拟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/

10-12 00:16