如何使用 KVO observe 协议的 属性?

How to use KVO observe protocol's property?

当我尝试将 dynamic 修饰符添加到协议的 属性.
时,

Xcode 显示错误 Only members of classes may be dynamic 所以我尝试了另一种方式,在 class 中添加 dynamic 而不是在协议中,Gettable 属性必须通过编写 {get}.
来指示 这是我的代码:

protocol.swift

var myproperty: Int {get} 

class.swift

dynamic var myproperty: Int {  
  return otherproperty  
}

如果我以正常方式观察myproperty,当otherproperty值改变时它不会触发KVO通知,因为myproperty值在调用或使用之前不会改变。
非常感谢!

我不认为你可以使协议属性动态化,只是classes/structs。

编辑:

您应该能够做的一件事是让您的 class 继承自 NSObject,然后实现调用 KVO willChangeValueForKey 和 didChangeValueForKey 方法的 willSet 和 didSet 方法。

在了解 Dynamic 属性之前,我使用 Swift class 完成了此操作,并且它起作用了。它也应该适用于协议,但使其工作的负担在于实现该协议的 class 或扩展。

我认为我们可以使用一些小技巧来实现我们的目标。在 protocol 添加一个名为 observeKeyPath 的 属性 像这样:

protocol.swift

var myproperty: Int {get} 
var observeKeyPath: String {get}

class.swift

dynamic otherproperty: AnyObject!
var myproperty: Int {  
  return otherproperty  
}
var observeKeyPath {
  return "otherproperty"
}

observe.swift

self.addObserver(protocol, 
      forKeyPath: protocol.observeKeyPath, 
         options: .New | .Old, 
         context: nil)

提示:如果keyPath使用点语法,如"object.property",请确保objectproperty都被dynamic修饰。