所以在SpriteKit中有这个类:
open class SKNode : UIResponder, NSCopying, NSCoding, UIFocusItem {
...
open var scene: SKScene? { get }
...
当scene
属性变为零时,我想触发一些逻辑。
这就是我的尝试:
class MyNode : SKNode {
override var scene: SKScene? {
didSet {
if scene != nil {
// my custom logic
}
}
}
}
但我收到一个错误:Cannot observe read-only property 'scene'; it can't change
这在理论上是有道理的。
实际上,属性的值会改变:
let node = SKNode()
print(node.scene?) // nil
scene.addChild(node)
print(node.scene?) // SKScene
我可以使用一些黑魔法吗?
答案 0 :(得分:4)
该属性是计算,值会更改,但永远不会设置。它是根据其他值计算的。
因此将didSet
放在那里是没有意义的。
来自Read-Only Computed Properties
具有getter但没有setter的计算属性称为只读计算属性。只读计算属性始终返回一个值,可以通过点语法访问,但不能设置为其他值。
如果我们谈论SKNode.scene
,它可能只是私有ivar _scene
的访问方法,或者它会动态上升到树并返回根。
由于它是一个Obj-C类,如果你真的需要它,你可以使用KVO来观察它。