Swift 3:观察只读属性

时间:2017-01-20 23:58:51

标签: swift sprite-kit

所以在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

我可以使用一些黑魔法吗?

1 个答案:

答案 0 :(得分:4)

该属性是计算,值会更改,但永远不会设置。它是根据其他值计算的。

因此将didSet放在那里是没有意义的。

来自Read-Only Computed Properties

  

具有getter但没有setter的计算属性称为只读计算属性。只读计算属性始终返回一个值,可以通过点语法访问,但不能设置为其他值。

如果我们谈论SKNode.scene,它可能只是私有ivar _scene的访问方法,或者它会动态上升到树并返回根。

由于它是一个Obj-C类,如果你真的需要它,你可以使用KVO来观察它。