gpt4 book ai didi

swift - RxSwift 与 BehaviorRelay 的双向绑定(bind)

转载 作者:搜寻专家 更新时间:2023-10-31 22:39:11 24 4
gpt4 key购买 nike

我创建了一个通用变量。例如,此变量可以连接到文本字段或其他界面元素,如开关。所以我的变量类型将是 Any,这样我就可以存储 bool 值、字符串或其他内容。

var test: BehaviorRelay<Any?> = BehaviorRelay<Any?>(value: nil)

然后我尝试将我的界面元素连接到这个变量

(self.switch.rx.value <-> viewModel.test).disposed(by: self.disposeBag)

或者

(self.textfield.rx.text <-> viewModel.test).disposed(by: self.disposeBag)

出现此错误 Cannot convert value of type 'BehaviorRelay<Any?>' to expected argument type 'BehaviorRelay<Bool>'Cannot convert value of type 'BehaviorRelay<Any?>' to expected argument type 'BehaviorRelay<String?>'

我如何使用 RxSwift 做到这一点?

你可以在这里找到我的 <-> func:

infix operator <->
func <-> <T>(property: ControlProperty<T>, variable: BehaviorRelay<T>) -> Disposable {
let bindToUIDisposable = variable.asObservable()
.bind(to: property)
let bindToVariable = property
.subscribe(onNext: { n in
variable.accept(n)
}, onCompleted: {
bindToUIDisposable.dispose()
})

return Disposables.create(bindToUIDisposable, bindToVariable)
}

最佳答案

(在这种情况下,双向绑定(bind)不会导致无限循环,因为 UI 元素在以编程方式修改时不会发出值,它们只会在用户更改值时发出。如果用户拨动开关,它被推送到 Subject [BehaviorRelay],后者随后将值推送回开关,但到此为止。)

您必须使用 map 将您的元素转换为 Any? 并映射 Any?从 BehaviorRelay 到 UI 元素时返回到正确的类型。这样做非常笨重且不安全。

更好的做法是让您的 BehaviorRelay 元素成为正确的类型。无论如何,您都必须知道类型才能对它做任何有用的事情。

关于swift - RxSwift 与 BehaviorRelay 的双向绑定(bind) <Any?>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51722547/

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