ios swift sprite-kit skspritenode designated-initializer

ios - Swift: debe llamar a un inicializador designado del error SKSpriteNode de la superclase



sprite-kit designated-initializer (2)

Cosas locas ... No entiendo completamente cómo logré solucionarlo ... pero esto funciona:

convenience init() { self.init(imageNamed:"bubble") self.hidden = true } init(texture: SKTexture!, color: UIColor!, size: CGSize) { super.init(texture: texture, color: color, size: size) }

agregue convenience para init y eliminar init(texture: SKTexture!)

Este código funcionó en el primer XCode 6 Beta, pero en el Beta más reciente no funciona y da tales errores. 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) } }

y así es como se inicializa esta clase:

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

Estoy atrapado con eso ... ¿cuál será la solución más fácil?


init(texture: SKTexture!, color: UIColor!, size: CGSize) es el único inicializador designado en la clase SKSpriteNode, el resto son todos los inicializadores de conveniencia, por lo que no puede invocar super. Cambia tu código a esto:

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) } }

Además, consolidaría todos estos en un solo inicializador.