Swift 如何使用KVO观察协议';谁的财产?
当我尝试向协议的属性添加Swift 如何使用KVO观察协议';谁的财产?,swift,dynamic,protocols,key-value-observing,Swift,Dynamic,Protocols,Key Value Observing,当我尝试向协议的属性添加dynamic修饰符时,Xcode显示错误只有类的成员可能是动态的。 因此,我尝试了另一种方法,在类中而不是在协议中添加动态,Gettable属性必须通过编写{get} 这是我的代码: 斯威夫特议定书 斯威夫特 如果我以正常方式观察myproperty,当otherproperty值更改时,它不会触发KVO通知,因为myproperty值在调用或使用之前不会更改。 非常感谢 我认为您不能使协议属性动态化,只能使类/结构动态化 编辑: 您应该能够做的一件事是使类从NSObj
dynamic
修饰符时,Xcode显示错误只有类的成员可能是动态的。
因此,我尝试了另一种方法,在类中而不是在协议中添加动态
,Gettable属性必须通过编写{get}
这是我的代码:
斯威夫特议定书
斯威夫特
如果我以正常方式观察myproperty
,当otherproperty
值更改时,它不会触发KVO通知,因为myproperty
值在调用或使用之前不会更改。
非常感谢 我认为您不能使协议属性动态化,只能使类/结构动态化
编辑:
您应该能够做的一件事是使类从NSObject继承,然后实现调用KVO willChangeValueForKey和didChangeValueForKey方法的willSet和didSet方法
在我学习动态属性之前,我用一个Swift类完成了这项工作,它起了作用。它应该也适用于协议,但使其工作的负担在于实现协议的类或扩展。我认为我们可以使用一些小技巧来实现我们的目标。在协议中
添加名为observeKeyPath
的属性,如下所示:
斯威夫特议定书
斯威夫特
斯威夫特先生
提示:如果键路径使用点语法,如“object.property”
,请确保对象
和属性
均由动态
修改,谢谢您的建议!
var myproperty: Int {get}
dynamic var myproperty: Int {
return otherproperty
}
var myproperty: Int {get}
var observeKeyPath: String {get}
dynamic otherproperty: AnyObject!
var myproperty: Int {
return otherproperty
}
var observeKeyPath {
return "otherproperty"
}
self.addObserver(protocol,
forKeyPath: protocol.observeKeyPath,
options: .New | .Old,
context: nil)