我正在尝试定义一个不同类型的Rxswift变量数组(Int,String,Bool,String?等等)
从技术上讲,我想要这样的东西,
var intVariable = Variable<Int>(10)
var stringVariable = Variable<String>("Hello, RxSwift")
let genericArray = [intVariable, stringVariable]
原因是,我有一个我想订阅的变量列表。
但是,我可以单独订阅变量,例如intVariable.asObservable().subscribe
,stringVariable.asObservable().subscribe
等等。
但如果它在数组中,我可以循环遍历所有元素并订阅它。
Rxswift变量定义为public final class Variable<Element>
答案 0 :(得分:1)
你在这里做什么完全取决于subscribe
闭包的样子。如果你对任一变量中的每个项目做同样的事情,无论类型如何,那么只需将它们映射到相同的类型:
let bag = DisposeBag()
let intVariable = Variable<Int>(10)
let stringVariable = Variable<String>("Hello, RxSwift")
let genericArray = Observable.merge([intVariable.asObservable().map { "\($0)" }, stringVariable.asObservable()])
genericArray.subscribe(onNext: { print($0) }).disposed(by: bag)
intVariable.value = 5
stringVariable.value = "Goodby, RxSwift"
打印:
10
Hello, RxSwift
5
Goodby, RxSwift
如果要以某种方式组合这两个项目,您需要保存每个变量的最新发布,并且需要保留类型信息,请执行以下操作:
let genericArray = Observable.combineLatest(intVariable.asObservable(), stringVariable.asObservable())
打印:
(10, "Hello, RxSwift")
(5, "Hello, RxSwift")
(5, "Goodby, RxSwift")
如果您只希望在从两个变量发出新元素时触发您的订阅,则:
let genericArray = Observable.zip(intVariable.asObservable(), stringVariable.asObservable())
打印:
(10, "Hello, RxSwift")
(5, "Goodby, RxSwift")
中提到的解决方案