【问题标题】:Swift 3: Observing a read-only propertySwift 3:观察只读属性
【发布时间】:2017-06-06 01:36:51
【问题描述】:

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

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

【问题讨论】:

    标签: swift sprite-kit


    【解决方案1】:

    属性是计算的,值会改变,但从未设置。它是根据其他值计算得出的。

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

    来自Read-Only Computed Properties

    具有 getter 但没有 setter 的计算属性称为只读计算属性。只读计算属性总是返回一个值,并且可以通过点语法访问,但不能设置为不同的值。

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

    既然是Obj-C类,如果真的需要的话,大概可以用KVO来观察值。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 2016-04-22
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    相关资源
    最近更新 更多