在 iOS 库类中的现有属性上添加属性观察器

问题描述 投票:0回答:3

在我的 SpriteKit 游戏中,我想在精灵的

fieldBitMask
SKPhysicsBody
属性上添加一个属性观察器。我希望在
fieldBitMask
属性发生变化时收到通知,以便我可以采取一些行动。

我覆盖了

SKPhysicsBody
但是当我尝试将覆盖的类分配给像普通
SKPhysicsBody
对象一样的精灵节点时,我遇到了一堆错误。我还考虑过为 SKPhysicsBody 进行扩展,但 Apple 文档说:“扩展可以向类型添加新功能,但不能覆盖现有功能。”所以看来我无法通过这种方式覆盖
fieldBitMask
属性以使其成为属性观察者。

我知道如何在我创建的新自定义类中创建属性观察器。但是,将属性观察器添加到属于 Apple 库的类中的现有属性的最佳方法是什么?

ios swift sprite-kit skphysicsbody overriding
3个回答
3
投票

你可以像这样子类化

SKPhysicsBody

class Subclass: SKPhysicsBody {
    override var fieldBitMask: UInt32 {
        didSet {
            print(fieldBitMask)
        }
    }
}

3
投票

我认为你可以使用键值观察。您可以将观察者添加到属性更改中。
您应该在观察者类中 implement

observeValue(forKeyPath:of:change:context:)
方法。

在这里您可以找到 Swift 示例(“键值观察”部分)。


0
投票

使用KVO

如果该属性是键值可观察的,则可以使用 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
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.