1

私は Swift で単純な観察可能なオブジェクトを考え出そうとしていますが、 RxSwiftを使用すると考えられています。次のようなことを行う簡単な例が見つかりませんでした。

protocol PropertyObservable {
  typealias PropertyType
  var propertyChanged: Event<(PropertyType, Any)> { get }
}

class Car: PropertyObservable {
  typealias PropertyType = CarProperty
  let propertyChanged = Event<(CarProperty, Any)>()

  dynamic var miles: Int = 0 {
    didSet {
      propertyChanged.raise(.Miles, oldValue as Any)
    }
  }

  dynamic var name: String = "Turbo" {
    didSet {
      propertyChanged.raise(.Name, oldValue as Any)
    }
  }
}

上記は、このブログ投稿からのオブザーバブルに対する純粋な Swift ソリューションです。侵襲的ではなく、プロトコルベースのソリューションであることが本当に気に入っています。私の場合、プロジェクトにオブジェクトがあり、各プロパティが内部で非同期に設定されています (Bluetooth デバイス)。したがって、プロパティをリアルタイムで取得/設定するのではなく、変更を監視/サブスクライブする必要があります。

RxSwift がまさにそれ以上のことを行うと聞いています。ただし、上記に一致する簡単な例が見つからず、RxSwift は私のニーズに対してやり過ぎだと思い始めていますか? 助けてくれてありがとう。

4

1 に答える 1

3

これを RxSwift ですばやく観測可能にする最も簡単な方法は、おそらく RxSwift クラス変数を使用することです (ここにあるすべてのコードは、頭の中でテストされていません)。

import RxSwift

class Car {

  var miles = Variable<Int>(0)

  var name = Variable<String>("Turbo")

}

これにより、サブスクライブすることで値を監視できます。

let disposeBag = DisposeBag()
let car = Car
car.name.asObservable()
  .subscribeNext { name in print("Car name changed to \(name)") }
  .addToDisposeBag(disposeBag) // Make sure the subscription disappears at some point.

これで、各イベントの古い値が失われました。もちろん、これを解決するには多くの方法があります。RxSwifty の方法は、おそらく要素 sequence にスキャン操作を追加することです。これは、通常の配列に対して reduce が行うのと同じように機能します。

car.name.asObservable()
  .scan(seed: ("", car.name.value)) { (lastEvent, newElement) in
    let (_, oldElement) = lastEvent
    return (oldElement, newElement)
  }
  .subscribeNext { (old, new) in print("Car name changed from \(old) to \(new)") }
  .addToDisposeBag(disposeBag)
于 2016-05-23T13:07:23.900 に答える