在下面的课程中,
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/