符合协议的对象上的Swift KVO
我有一个协议(X)和一个实现协议X的类(a):符合协议的对象上的Swift KVO,swift,protocols,key-value-observing,Swift,Protocols,Key Value Observing,我有一个协议(X)和一个实现协议X的类(a): protocol X, NSObjectProtocol { var toBeObserved: MyCustomClass? { get} } class A: NSObject, X { var toBeObserved: MyCustomClass? ... } 在另一个类中,我想观察变量toBeObserved: class B { ... var instanceConformingToX: X &l
protocol X, NSObjectProtocol {
var toBeObserved: MyCustomClass? { get}
}
class A: NSObject, X {
var toBeObserved: MyCustomClass?
...
}
在另一个类中,我想观察变量toBeObserved
:
class B {
...
var instanceConformingToX: X <-note: not A but simply the protocol X
...
func someFunc() {
self.observation = self.observe(\.instanceConformingToX.toBeObserved) { (observed, change) in
...
}
}
}
谢谢。确保将观察到的属性标记为
@objc
和动态
。正如上面所说:
使用@objc
属性和动态
修饰符标记要通过键值观察来观察的属性
协议和参与类也需要标记为@objc
。例如:
class MyCustomClass: NSObject { ... }
@objc protocol X: NSObjectProtocol {
@objc dynamic var toBeObserved: MyCustomClass? { get }
}
class A: NSObject, X {
var toBeObserved: MyCustomClass? = MyCustomClass()
}
class B: NSObject {
@objc var x: X = A()
var token: NSKeyValueObservation?
func addObserver() {
token = observe(\.x.toBeObserved) { object, _ in
print(object)
}
}
}
需要暴露在KVO中的所有内容都必须标记为
@objc
,@objc dynamic
是否也需要打开A.tobeobbserved
?我认为遵从X是不够的(因为这可能发生在编译A之后)。(虽然还没有测试过,只是感觉像那样。)不,显然没有。我已经测试了上面的功能,并且可以正常工作。显然,如果你没有协议,你会的。但我试图将其缩减到最低限度……我在`@objc var x:x=A()`,不错;`)中缺少了@objc谢谢
class MyCustomClass: NSObject { ... }
@objc protocol X: NSObjectProtocol {
@objc dynamic var toBeObserved: MyCustomClass? { get }
}
class A: NSObject, X {
var toBeObserved: MyCustomClass? = MyCustomClass()
}
class B: NSObject {
@objc var x: X = A()
var token: NSKeyValueObservation?
func addObserver() {
token = observe(\.x.toBeObserved) { object, _ in
print(object)
}
}
}