小编Car*_*ire的帖子

RX中是否存在只读的BehaviorSubject接口,如果不存在,那么制作一个接口是不是一个坏主意?

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)

system.reactive swift rx-swift

8
推荐指数
1
解决办法
1115
查看次数

嵌套通用约束:在受限于该泛型类型的通用序列扩展内约束泛型项的T.

在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]

generics swift

5
推荐指数
1
解决办法
566
查看次数

标签 统计

swift ×2

generics ×1

rx-swift ×1

system.reactive ×1