我正在嘗試創建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。好吧。
SKSpriteNode的指定init是什麼?你只應該調用超類的指定初始化方法我相信 – connor
指定的初始化方法是'init(texture:color:size)',但它並不特別適合我的子類。當我可以使用'et trollSprite = TrollSpriteRegular()'來調用'let troll = TrollSpriteRegular(texture:nil,color:nil,size:CGSizeZero)'似乎是不必要的混亂。但是如果這是探戈的方式我想我必須屈服... –