使用kvo进行swift协议扩展

时间:2018-01-10 19:29:16

标签: swift protocols avplayer key-value-observing

我想创建一个具有默认kvo功能的协议。但是,我遇到协议扩展继承NSObject的问题。当我尝试覆盖observeValue(forKeyPath时,我收到错误Method does not override any method from its superclass。以下是我正在尝试做的一些示例代码

protocol VideoTest {
  var player:AVPlayer { get set }
  func trackVideoStart()
}


struct ObserverContexts {
   static var playerRate = 0
}

extension VideoTest where Self: NSObject {

   func addPlayerObservers() {
       player.addObserver(self, forKeyPath: #keyPath(AVPlayer.rate),
                       options: ([.old, .new]),
                       context: &ObserverContexts.playerRate)
   }

    //gives error
    override public func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?,
                                  context: UnsafeMutableRawPointer?) {

     }

}

是否可以通过协议扩展使用KVO,因为我不能直接从NSObject继承?

1 个答案:

答案 0 :(得分:1)

这是因为编译器会查找您在VideoTest协议本身上覆盖的功能。 where子句只是告诉它只在VideoTest属于NSObject类型时才进行扩展。

无论这是否有效,你无论如何都无法实现这一点,因为扩展根本无法覆盖功能。请参阅扩展here的swift文档,特别是这一点:

  

请注意

     

扩展程序可以为类型添加新功能,但它们不能   覆盖现有功能。