簡體   English   中英

初始化屬性時未調用didSet觀察器

[英]didSet observer does not get called when initialising property

鑒於以下課程,

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)

    } 

}

好像沒有調用position屬性的didSet觀察器。

由於didSet觀察者應該在position屬性被修改時設置SpriteKit節點的位置,所以我認為與其使用在didSet塊中包含的同一行代碼,還可以觸發后者,但這似乎行不通。 當創建場景時(在主GameScene中,該場景僅創建一個Spaceship對象,並將spaceship.node添加到場景的子節點中),該node的位置似乎為0; 0 0; 0

為什么會發生這種情況的任何線索? 謝謝。

更新:盡管defer語句有效,但是賦值不允許使用它。

與其使用didSet更新節點, 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 }
    }
}

在調用超類初始化器之后,在子類初始化器中設置屬性時,將調用超類屬性的willSet和didSet觀察器。 在類設置其自己的屬性時 ,在調用超類初始化程序之前, 不會調用它們

一種可能的解決方案是將position屬性設置在Spaceship的初始化程序之外,或者也直接設置node的位置。

我個人只是將Spaceship子類化為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)時,您將遇到問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM