Swift - Must call a designated initializer of the superclass SKSpriteNode error

69,935

Solution 1

init(texture: SKTexture!, color: UIColor!, size: CGSize) is the only designated initializer in the SKSpriteNode class, the rest are all convenience initializers, so you can't call super on them. Change your code to this:

class Creature: SKSpriteNode {
    var isAlive:Bool = false {
        didSet {
            self.hidden = !isAlive
        }
    }
    var livingNeighbours:Int = 0

    init() {
        // super.init(imageNamed:"bubble") You can't do this because you are not calling a designated initializer.
        let texture = SKTexture(imageNamed: "bubble")
        super.init(texture: texture, color: UIColor.clearColor(), size: texture.size())
        self.hidden = true
    }

    init(texture: SKTexture!) {
        //super.init(texture: texture) You can't do this because you are not calling a designated initializer.
        super.init(texture: texture, color: UIColor.clearColor(), size: texture.size())
    }

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

Furthermore I would consolidate all of these into a single initializer.

Solution 2

Crazy stuff.. I don't fully understand how I managed to fix it.. but this works:

convenience init() {
    self.init(imageNamed:"bubble")
    self.hidden = true
}

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

add convenience to init and remove init(texture: SKTexture!)

Share:
69,935
Kosmetika
Author by

Kosmetika

#SOreadytohelp

Updated on July 05, 2022

Comments

  • Kosmetika
    Kosmetika almost 2 years

    This code worked on first XCode 6 Beta, but on latest Beta it's not working and gives such errors Must call a designated initializer of the superclass SKSpriteNode:

    import SpriteKit
    
    class Creature: SKSpriteNode {
      var isAlive:Bool = false {
        didSet {
            self.hidden = !isAlive
        }
      }
      var livingNeighbours:Int = 0
    
      init() {
        // throws: must call a designated initializer of the superclass SKSpriteNode
        super.init(imageNamed:"bubble") 
        self.hidden = true
      }
    
      init(texture: SKTexture!) {
        // throws: must call a designated initializer of the superclass SKSpriteNode
        super.init(texture: texture)
      }
    
      init(texture: SKTexture!, color: UIColor!, size: CGSize) {
        super.init(texture: texture, color: color, size: size)
      }
    }
    

    and that's how this class is initialiazed:

    let creature = Creature()
    creature.anchorPoint = CGPoint(x: 0, y: 0)
    creature.position = CGPoint(x: Int(posX), y: Int(posY))
    self.addChild(creature)
    

    I'm stuck with it.. what will be the easiest fix?

  • Kosmetika
    Kosmetika almost 10 years
    I managed to fix this with overriding convenience init - stackoverflow.com/a/25164687/2117550
  • drewblaisdell
    drewblaisdell over 9 years
    @grfs: Very helpful answer, but I'm curious: where is it documented that this is the only designated initializer for SKSpriteNode?
  • Epic Byte
    Epic Byte over 9 years
  • Epic Byte
    Epic Byte over 9 years
    @drewblaisdell If you look at how the initializers are declared, you will see the convenience initializers are marked with the convenience keyword, and the designated initializers are not. It's not that clear because you need to click on every initializer and look at the way it's declared. Hopefully they develop a better way of showing it in the future.
  • Shawn J. Molloy
    Shawn J. Molloy almost 9 years
    I wish I could up vote this twice as this answer just made the correlation between convenience initializers and super inits click for me. Thanks @Epic Byte
  • SwampThingTom
    SwampThingTom over 8 years
    Good answer but assuming you want it to work like the existing convenience initializers, then the color parameter should default to SKColor.whiteColor() not UIColor.clearColor().