【发布时间】:2018-08-07 08:46:55
【问题描述】:
我创建了一个通用变量。例如,此变量可以连接到 textField 或其他界面元素,例如开关。所以我的变量的类型将是 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)
}
【问题讨论】:
-
@duan 我可以问你更多关于你的答案的细节吗?
-
我不喜欢这种不分青红皂白地使用主题。此外,
<->可以简化很多。双向使用bind(to:)而不是subscribe用于一条路线。 -
@Charlotte 对不起,这是我的错误,它不会导致无限循环