在我的 SpriteKit 游戏中,我想在精灵的
fieldBitMask
的 SKPhysicsBody
属性上添加一个属性观察器。我希望在 fieldBitMask
属性发生变化时收到通知,以便我可以采取一些行动。
我覆盖了
SKPhysicsBody
但是当我尝试将覆盖的类分配给像普通 SKPhysicsBody
对象一样的精灵节点时,我遇到了一堆错误。我还考虑过为 SKPhysicsBody 进行扩展,但 Apple 文档说:“扩展可以向类型添加新功能,但不能覆盖现有功能。”所以看来我无法通过这种方式覆盖 fieldBitMask
属性以使其成为属性观察者。
我知道如何在我创建的新自定义类中创建属性观察器。但是,将属性观察器添加到属于 Apple 库的类中的现有属性的最佳方法是什么?
你可以像这样子类化
SKPhysicsBody
:
class Subclass: SKPhysicsBody {
override var fieldBitMask: UInt32 {
didSet {
print(fieldBitMask)
}
}
}
如果该属性是键值可观察的,则可以使用 KVO 来实现。这是一个例子:
class A {
// Let's assume sampleProperty is key-value observable
var sampleProperty: AType
}
class B {
var anInstance: A
init() {
... // Initialization
setupKVO()
}
deinit {
anInstance.removeObserver(self, forKeyPath: "sampleProperty")
}
private func setupKVO() {
anInstance.addObserver(self, forKeyPath: "sampleProperty", options: [.new, .old], context: nil)
}
override func observeValue(forKeyPath keyPath: String?,
of object: Any?,
change: [NSKeyValueChangeKey: Any]?,
context: UnsafeMutableRawPointer?) {
if keyPath == "sampleProperty" {
if let oldSampleProperty = change?[.oldKey] as? AType,
let newSampleProperty = change?[.newKey] as? AType {
... // Do whatever you want with the observed values
}
}
}
}