2017-05-03 125 views
1

我試圖定義Rxswift變量數組,它是不同類型的(智力,字符串,布爾,字符串?,等...)RxSwift陣列與不同類型的

因此從技術上講我想是這樣這個,

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>

P.S我試圖類型擦除但沒有運氣。任何幫助,將不勝感激!

+0

我懷疑這是可能的嗎?您需要訂閱不同類型的變量的情況如何? – iWheelBuy

+0

而不是製作一個循環來訂閱每個單獨的observable,我建議訂閱一次to合併的observables序列。既然你有不同類型的變量,你可以執行這裏描述的解決方法http://stackoverflow.com/questions/39050059/rxswift-merge-different-kind-of-observables – Nimble

+0

謝謝@Nimble,對我的情況很好。 –

回答

0

你在這裏做什麼完全取決於什麼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)中提到的解決方案

+0

謝謝@Daniel T,我用'combineLatest'和'zip'看到的問題是它僅限於8個參數,而不是通用的。 我覺得第一個選擇(合併)將是我的案例的最佳選擇,因爲我只需要聽取更新並在任何更改時運行invalidateLayout。 –

+0

他們絕對是通用的。如果您有超過8個參數,則使用組合或拉鍊的拉鍊。 –