gpt4 book ai didi

swift - 如何通过访问 RxSwift 中的最新值来模拟计算属性?

转载 作者:行者123 更新时间:2023-11-28 08:01:05 27 4
gpt4 key购买 nike

如果我想模拟一个标准属性,例如 Bool在 RxSwift 中我可以使用 let isValid = Variable<Bool>(false)然后使用 .value获得内联的最后一个值和.asObservable()访问流。

但是我想模拟一个计算属性,例如var isValid { return self.password.characters.count > 0 }并且还能够以内联方式以及以可观察流的形式获取最后一个值。

我希望能够做到这两点,这样我就可以编写类似...的代码

if isValid.value { // isValid is Variable<Bool>
// ... do something ....
}

以及绑定(bind)到例如一个文本框

我知道我可以写成一个纯粹的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:{ [weak self] value in self?.valid = valid})

有了这个isValid用于绑定(bind)和订阅,valid用于命令式代码。

顺便说一句,你对 isValid 的定义有点“不自然”,把它变成let isValid: Observable<Bool>并在 init 中赋值喜欢isValid = username.asObservable().map({$0.characters.count > 0})

更新:

另一种解决方案是使用 RxBlockling,您可以使用 try! isValid.toBlocking().single() 获取当前值但我认为这是一个更糟糕的解决方案,通常不推荐。

关于swift - 如何通过访问 RxSwift 中的最新值来模拟计算属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46690698/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com