我想创建一个具有默认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继承?
答案 0 :(得分:1)
这是因为编译器会查找您在VideoTest协议本身上覆盖的功能。 where子句只是告诉它只在VideoTest属于NSObject类型时才进行扩展。
无论这是否有效,你无论如何都无法实现这一点,因为扩展根本无法覆盖功能。请参阅扩展here的swift文档,特别是这一点:
请注意
扩展程序可以为类型添加新功能,但它们不能 覆盖现有功能。