首页 文章

RxSwift变量数组有不同的类型

提问于
浏览
1

我试图定义一个Rxswift变量数组,它有不同的类型(Int,String,Bool,String?等...)

所以在技术上我想要这样的东西,

var intVariable = Variable<Int>(10)
var stringVariable = Variable<String>("Hello, RxSwift")
let genericArray = [intVariable, stringVariable]

原因是,我有一个我想订阅的变量列表 .

但是,我可以单独订阅变量,如 intVariable.asObservable().subscribestringVariable.asObservable().subscribe 等 . 但如果它在一个数组中,我可以循环遍历所有元素并订阅它 .

Rxswift变量定义为 public final class Variable<Element>

P.S我尝试过类型擦除但没有运气 . 任何有关这方面的帮助将不胜感激!

1 回答

  • 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")
    

    我会避免(RxSwift merge different kind of Observables)中提到的解决方案

相关问题