【发布时间】:2014-06-18 15:17:48
【问题描述】:
我正在尝试创建一个SKSpriteNode 子类。计划是让它在内部处理大部分设置,但令人讨厌的是,这似乎会强制执行相当多的代码重复,特别是在设置非可选的 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)
}
}
如果我尝试从两个初始化程序之一中删除头或主体的创建,则会导致编译器错误并且我无法构建。有什么办法可以避免这种情况,还是上述模式不是特别快速友好?
我“需要”init 方法以允许通过使用 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是什么?你应该只调用我相信的超类的指定初始化器
-
指定的初始化器是
init(texture:color:size),但它不是特别适合我的子类。当我本可以摆脱et trollSprite = TrollSpriteRegular()时,不得不打电话给let troll = TrollSpriteRegular(texture: nil, color: nil, size: CGSizeZero)似乎不必要的麻烦但如果那是探戈的方式,我想我必须屈服......
标签: initialization sprite-kit swift subclassing