初始化属性时未调用didSet观察器

时间:2019-03-07 17:45:37

标签: swift sprite-kit

给出以下课程,

<Employee>
    <Name>abc</Name>
    <Number number_type = "Id">123</Number>
    <Number number_type = "dept">456</Number>
</Employee>

似乎没有调用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观察者应该设置SpriteKit节点的位置,因此我认为,与其使用position块中包含的同一行代码,我可以触发后者,但是似乎不起作用;创建场景时(在主GameScene中,该场景仅创建了didSet对象,并将Spaceship添加到场景的节点子对象中),spaceship.node的位置似乎是{{ 1}}。

关于为什么会发生这种情况的任何线索?谢谢。

更新:尽管node语句有效,但是该分配不允许使用它。

3 个答案:

答案 0 :(得分:3)

与其使用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 }
    }
}

答案 1 :(得分:1)

  

在调用超类初始化器之后,在子类初始化器中设置属性时,将调用超类属性的willSet和didSet观察器。 在超类初始化程序被调用之前,类在设置自己的属性时不会被调用

一个可能的解决方案是在position的初始化程序之外设置Spaceship属性,或者直接设置node的位置。

答案 2 :(得分:0)

我个人只是将飞船归类为SKSpriteNode。太空飞船似乎并不是一个复杂的对象,它涉及到继承之上的合成。

class Spaceship : SKSpriteNode {
    convenience init(frame: CGRect) {
        self.init(
            color: UIColor.red,
            size: CGSize(
                width: frame.size.width / 5, 
                height: frame.size.width / 5
            )
        )
        self.position = CGPoint(x: frame.midX, y: frame.midY)
   } 
}

现在我不确定您为什么要像这样传递帧...。我假设帧是您的场景?如果是这种情况,当锚点不是(0,0)时,您将遇到问题。