如何使用 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"
,请确保object
和property
都被dynamic
修饰。
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"
,请确保object
和property
都被dynamic
修饰。