2014-06-18 109 views
0

我正在嘗試創建SKSpriteNode子類。該計劃是讓它在內部處理大部分設置,但令人煩惱的是,這似乎強制執行了很多代碼複製,特別是在設置非可選ivars和常量時。是否在所有init方法中都要求設置非可選ivars?

class TrollSpriteRegular : SKSpriteNode{ 
    let head : SKSpriteNode 
    let body : SKSpriteNode 

    init(){ 
     head = SKSpriteNode(color: SKColor.orangeColor(), size: CGSizeMake(60, 60)) 
     body = SKSpriteNode(color: SKColor.purpleColor(), size: CGSizeMake(40, 60)) 
     super.init() 
    } 

    // Desginated intiallizer 
    init(texture: SKTexture!, color: UIColor!, size: CGSize) { 
     head = SKSpriteNode(color: SKColor.orangeColor(), size: CGSizeMake(60, 60)) 
     body = SKSpriteNode(color: SKColor.purpleColor(), size: CGSizeMake(40, 60)) 
     super.init(texture: texture, color: color, size: size) 
    } 
} 

如果我試圖從兩個初始化這將導致一個編譯器錯誤的一方刪除頭部或身體的創作,我無法建立。有什麼辦法可以避免這種情況發生,或者上述模式不是特別快捷?

我「需要」初始化方法,只需使用let trollSprite = TrollSpriteRegular()即可創建新實例。


編輯:好的,上面的代碼可以通過在聲明時定義常量來簡化。

class TrollSpriteRegular : SKSpriteNode{ 
    let head = SKSpriteNode(color: SKColor.orangeColor(), size: CGSizeMake(60, 60)) 
    let body = SKSpriteNode(color: SKColor.purpleColor(), size: CGSizeMake(40, 60)) 
... 

但是,如果我添加一個變量,實際上應該通過init方法接收它的值,我會有同樣的問題。例如: -

let trollName : String 

init(name :String){ 
    trollName = name 
    super.init(texture: nil, color: nil, size: CGSizeZero) 
} 

這將迫使我都在我自己的init(name:)並在指定初始化定義trollName。好吧。

+0

SKSpriteNode的指定init是什麼?你只應該調用超類的指定初始化方法我相信 – connor

+0

指定的初始化方法是'init(texture:color:size)',但它並不特別適合我的子類。當我可以使用'et trollSprite = TrollSpriteRegular()'來調用'let troll = TrollSpriteRegular(texture:nil,color:nil,size:CGSizeZero)'似乎是不必要的混亂。但是如果這是探戈的方式我想我必須屈服... –

回答

1

需要指定的初始化器來初始化所有類的狀態。在便捷初始值設定項中,您可以將該責任委派給指定的初始值設定項。

但是,在你的情況下,它看起來像你想要兩個指定初始值設定項。但是由於這些變量不依賴於初始化器對其值的任何輸入,所以您可以在其聲明中定義它們的值。這裏是該類的重複性較低的版本:

class TrollSpriteRegular : SKSpriteNode { 
    let head : SKSpriteNode = SKSpriteNode(color: SKColor.orangeColor(), size: CGSizeMake(60, 60)) 
    let body : SKSpriteNode = SKSpriteNode(color: SKColor.purpleColor(), size: CGSizeMake(40, 60)) 
} 
+0

沒錯。說得通。 –

+0

儘管如此,如果我想添加通過自己的初始化程序創建的其他(屬性類)ivars,我仍然需要在指定的初始化程序和我自己的程序中定義它們的值,對吧? –

+0

@nickfalk:我不太清楚你的意思。你想創建的任何值都不依賴於輸入初始化器,可以這樣定義。如果它依賴於初始化器的輸入,那麼所有指定的初始化器都必須定義它 - 但是需要許多指定的初始化器並不正常。很多時候你只需要編寫一個便利的初始化工具即可。 – Chuck

1

這種行爲是可以預料的,因爲非可選變量不能爲零。如果您正在尋找更簡潔的方法,可以使用默認值(顏色和大小)對變量進行內聯初始化。然後,如果碰巧有一個初始值設定項需要更改其中一個值,則可以直接更改精靈的顏色或大小屬性的值。

class TrollSpriteRegular: SKSpriteNode { 
    let head = SKSpriteNode(color: SKColor.orangeColor(), size: CGSizeMake(60.0, 60.0)) 
    let body = SKSpriteNode(color: SKColor.purpleColor(), size: CGSizeMake(40.0, 60.0)) 

    ... 
} 
相關問題