2016-03-06 43 views
2

创建初始化器我一直在试图重写一个便利的初始化,让我来实例化一个SKSpriteNode孩子一些额外的属性SKSpriteNode初始化,但每次我试图,我不断收到编译器错误。据我所知,这是两大规则。为SKSpriteNode子类

规则:

  1. 一切便利初始化必须引用指定初始化,无论是从类本身或父类
  2. 子类属性必须初始化器委托给父母之前设置。

这里是我的代码,我相信如下的规则:

class WalkingMonster: SKSpriteNode { 
    var rangeOfMovement: CGFloat 
    var originalPosition: CGFloat 
    var platformNumber: Int 
    var imageName = "walkingAlien" 
    var sizes = [CGSize(width: CGFloat(30.0), height: CGFloat(30.0)), CGSize(width: CGFloat(30.0), height: CGFloat(15.0)), CGSize(width: CGFloat(30.0), height: CGFloat(7.0))] 

    override init(texture: SKTexture?, color: UIColor, size: CGSize) { 
     super.init(texture: texture!, color: color, size: size) 
    } 

    convenience init(texture: SKTexture, color: UIColor, size: CGSize, rangeOfMovement: CGFloat, originalPosition: CGFloat, platformNumber: Int) { 
     self.rangeOfMovement = rangeOfMovement 
     self.originalPosition = originalPosition 
     self.platformNumber = platformNumber 
     self.init(texture: texture, color: color, size: size) 
    } 
} 

我由编译器来实现以下所需的初始化告知,只会引发错误:

required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

当我实现它,我获得()一个错误,指出self.rangeOfMovement不是在super.init初始化调用和self.init调用之前委托初始使用自我。当我将自己从初始化程序中取出时,它将每个成员变量作为函数的局部变量处理。

我曾尝试调换覆盖的init()调用和使用super.init()在子类中方便初始化。

class WalkingMonster: SKSpriteNode { 
    var rangeOfMovement: CGFloat 
    var originalPosition: CGFloat 
    var platformNumber: Int 
    var imageName = "walkingAlien" 
    var sizes = [CGSize(width: CGFloat(30.0), height: CGFloat(30.0)), CGSize(width: CGFloat(30.0), height: CGFloat(15.0)), CGSize(width: CGFloat(30.0), height: CGFloat(7.0))] 

    convenience init(texture: SKTexture, color: UIColor, size: CGSize, rangeOfMovement: CGFloat, originalPosition: CGFloat, platformNumber: Int) { 
     self.rangeOfMovement = rangeOfMovement 
     self.originalPosition = originalPosition 
     self.platformNumber = platformNumber 
     super.init(texture: texture, color: color, size: size) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    } 

我得到一个错误说的WalkingMonster方便初始化必须self.init而不是链接委托给一个超类初始化用super.init(),我已经尝试没有成功实施之前。我觉得重写初始化属性应该是一件非常简单的事情,我必须错过一些东西。与往常一样,任何帮助,非常感谢

回答

2

编译器是正确的:你的覆盖会很好,除非你还没有初始化你的属性。如果你需要有参数,要做到这一点,那么你需要创建一个新的指定初始化,而不是:你init(texture: SKTexture, color: UIColor, size: CGSize, rangeOfMovement: CGFloat, originalPosition: CGFloat, platformNumber: Int)会做;只需从中删除convenience,因为它是一个新的指定初始化程序,而不是便利的初始化程序。 (便利初始化,因为编译器所指出的,必须跨委托self.something,不为你希望做的。)

至于init?(coder:),你没事,只要使用fatalError版本为你永远不会编码或解码您的子类的实例。如果您需要利用NSCoding,那么你就需要提供init?(coder:)工作的实施和覆盖encodeWithCoder(_:),太。

+0

它仍然需要NSCoder初始化。是好的,还是会崩溃我的游戏与fatalError(“初始(编码:) :)尚未实施”)? –

+0

只要你永远不会调用它,崩溃的实现就没有问题。如果你使用'NSCoding'来编码或解码你的子类,它将被调用。 – andyvn22