Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
符合协议的对象上的Swift KVO_Swift_Protocols_Key Value Observing - Fatal编程技术网

符合协议的对象上的Swift KVO

符合协议的对象上的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

我有一个协议(X)和一个实现协议X的类(a):

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)
        }
    }
}