首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过访问RxSwift中的最新值来模拟计算属性?

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

Stack Overflow用户
提问于 2017-10-11 22:21:15
回答 2查看 843关注 0票数 1

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

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

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

代码语言:javascript
复制
if isValid.value { // isValid is Variable<Bool>
    // ... do something ....
}

以及绑定到例如TextField

我知道我可以像下面这样写一个纯Observable

代码语言:javascript
复制
var isValid: Observable<Bool> {
    return self.username.asObservable().map { username in   // username is Variable<String>
        return username.characters.count > 0
    }
}

但是,我必须重构前面的示例,使其成为....

代码语言:javascript
复制
isValid.subscribe { isValid in 
    if isValid.element {
        // ... do something ....
    }
}.dispose(of: self.disposeBag)

那么,我如何在RxSwift中表达一个可以作为内联值和流使用的计算属性呢?

EN

回答 2

Stack Overflow用户

发布于 2017-10-11 23:01:46

我遇到了同样的问题,最终得到了一个看起来不干净但有效的解决方案。我将向更新它的isValid可观察对象添加一个新的var valid: Bool = false和一个订阅

isValid.subscribe(onNext:{ self?.valid中的弱自身值=有效})

在这种情况下,isValid用于绑定和订阅,valid用于命令式代码。

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

更新:

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

票数 0
EN

Stack Overflow用户

发布于 2017-10-11 23:18:02

试试这个:

代码语言:javascript
复制
let username = Variable("")

private let _isValid: Observable<Bool> = username.asObservable().map{ $0.characters.count > 0 }

let isValid = Variable(false)

然后,在你的initviewDidLoad或其他任何地方:

代码语言:javascript
复制
_isValid.asObservable()
    .bind(to: isValid)
    .disposed(by: bag)

您可以使用以下命令进行测试:

代码语言:javascript
复制
isValid.asObservable()
    .subscribe(onNext: {
        print("value: \($0)")

    })
    .disposed(by: disposeBag)

username.value = "xfreire"

// OUTPUTS:
// value: false
// value: true

而且你仍然能够做到:

代码语言:javascript
复制
if isValid.value {
    // ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46690698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档