iOS RxSwift 4.2如何使用DelegateProxy实现CBCentralManager的Reactive扩展?

iOS RxSwift 4.2 how to implement Reactive extension of CBCentralManager using DelegateProxy?

我在看this example of using reactive extensions with Core Bluetooth。但是,它是用 swift 3.0 编写的,在 Swift 4.2 中有一些错误 运行。我有兴趣实现 CBCentralManager 的响应式扩展,以便为我提供状态事件的 RX 流。

我的理解是,这允许代理从 CBCentralManager 接收委托事件,并使用 _stateBehaviorSubject: BehaviorSubject<CBManagerState>? 将它们传播给观察者但是,该项目有太多错误,我无法弄清楚我应该在哪里剪切以保留只有我想要的功能。

如何使用 DelegateProxy 为 CBCentralManager 实现响应式扩展?

extension Reactive where Base: CBCentralManager {

  public var delegate: DelegateProxy {
    return RxCBCentralManagerDelegateProxy.proxyForObject(base)
  }

  public var state: Observable<CBManagerState> {
    let proxy = RxCBCentralManagerDelegateProxy.proxyForObject(base) //error here
    return proxy.stateBehaviorSubject.skip(1)
  }
}

这是 CBCentralManager

的有效实现
extension CBCentralManager : HasDelegate {
    public typealias Delegate = CBCentralManagerDelegate
}

class RxCBCentralManagerDelegateProxy
  : DelegateProxy<CBCentralManager, CBCentralManagerDelegate>
  , DelegateProxyType
  , CBCentralManagerDelegate
{

   internal let stateBehaviorSubject: BehaviorSubject<CBManagerState>

   init(centralManager: CBCentralManager) {
       let subject = BehaviorSubject(value: centralManager.state)
       stateBehaviorSubject = subject

       super.init(parentObject: centralManager, delegateProxy: RxCBCentralManagerDelegateProxy.self)
   }

   func centralManagerDidUpdateState(_ central: CBCentralManager) {
       stateBehaviorSubject.onNext(central.state)
       _forwardToDelegate?.centralManagerDidUpdateState(central)
   }

   static func registerKnownImplementations() {
       self.register { RxCBCentralManagerDelegateProxy(centralManager: [=10=]) }
   }

   deinit {
       stateBehaviorSubject.on(.completed)
   }
}

extension Reactive where Base : CBCentralManager {
   var delegate: DelegateProxy<CBCentralManager, CBCentralManagerDelegate> {
       return RxCBCentralManagerDelegateProxy.proxy(for: base)
   }

   var state: ControlEvent<CBManagerState> {
       let source = (delegate as! RxCBCentralManagerDelegateProxy)
          .stateBehaviorSubject
          .skip(1)
       return ControlEvent(events: source)
   }
}