RX的实现提供BehaviorSubject<T>和Variable<T>作为随时间变化的建模特性机制(C#INotifyPropertyChanged的一种有用的替代品).
通常这些都是暴露的,Observable<T>但是将属性公开为更有用:
class ObservableValue<T> : Observable<T>{
var currentValue:T { get }
}
Run Code Online (Sandbox Code Playgroud)
这可以在swift中沿着这些行创建:
class ObservableValue<Element> : ObservableType {
typealias E = Element
private let subject:BehaviorSubject<E>
var currentValue:E {
get {
return try! subject.value()
}
}
init(subject:BehaviorSubject<E>) {
self.subject = subject
}
func subscribe<O: ObserverType where O.E == E>(observer: O) -> Disposable {
return self.subject.subscribe(observer)
}
Run Code Online (Sandbox Code Playgroud)
}
这已经存在了吗?如果不是因为它违背了Rx的目标?
围绕它的唯一方法是公开一个单独的currentValue或写消费者,假设暴露的Observable背后的具体实现是BehaviourSubject或链中的某个地方发生了重放(),例如以下代码片段并未明确表示当我订阅时,我会得到一个值:
class MyViewModel {
// 'I will notify you of changes perhaps including my current value'
myProperty:Observable<String> …Run Code Online (Sandbox Code Playgroud) 在Swift中,我们可以编写通用项目的扩展,例如序列:
extension Sequence where Iterator.Element : ObservableType {
}
Run Code Online (Sandbox Code Playgroud)
这将保证扩展仅适用于(在这种情况下)RxSwift可观察量的序列.
但是,如果元素约束是另一个泛型,那么你可以约束那个泛型吗?例如:
extension Sequence where Iterator.Element : ObservableType where E : MyType {
}
Run Code Online (Sandbox Code Playgroud)
在上面的伪代码(不起作用)中,意图是:
此扩展应该应用于Observable的序列,其中Observable是MyType类型的Observable,例如[Observable]