在下面的课程中,

class Spaceship {

    var position: CGPoint! {
        didSet {
            node.position = position
        }
    }

    var node: SKSpriteNode!

    init(frame: CGRect) {

        node = SKSpriteNode(
            color: UIColor.red,
            size: CGSize(
                width: frame.size.width / 5,
                height: frame.size.width / 5
            )
        )

        self.position = CGPoint(x: frame.midX, y: frame.midY)

    }

}

似乎没有调用didSet属性的position观察者。
因为当didSet属性被修改时,position观察者应该设置spritekit节点的位置,所以我认为,与其使用didSet块中包含的同一行代码,我可以触发后者,但它似乎不起作用;当场景被创建时(在主游戏场景中,只需创建一个Spaceship对象并将spaceship.node添加到场景的节点子节点中,node的位置似乎是0; 0
你知道为什么会这样吗?谢谢您。
更新:尽管defer语句有效,但赋值不允许使用它。

最佳答案

与其使用didSet更新节点,不如直接将查询转发给它:

class Spaceship {

    let node: SKSpriteNode

    init(frame: CGRect) {
        self.node = SKSpriteNode(
            color: UIColor.red,
            size: CGSize(
                width: frame.size.width / 5,
                height: frame.size.width / 5
            )
        )

        self.position = CGPoint(x: frame.midX, y: frame.midY)
    }

    var position: CGPoint {
        get { return node.position }
        set { node.position = newValue }
    }
}

关于swift - 初始化属性时未调用didSet观察器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55049941/

10-12 13:37