2014-06-06 29 views
6

Sono molto nuovo allo sviluppo di iOS, ma ho giocato con l'app modello SpriteKit per imparare come funzionano le cose e provare a fare il boot su Swift mentre ci sono. Una cosa che ho problemi è come lavorare con le sottoclassi SpriteKit.Sottoclasse classi SpriteKit in Swift

Sono nel file GameScene.swift e sto cercando di estrarre una classe per l'etichetta "Ciao Mondo", ecco questo che quel file assomiglia:

// GameScene.swift 

import SpriteKit 

class HelloLabel: SKLabelNode { 
    init(fontNamed: String) { 
     super.init(fontNamed: fontNamed) 
     self.text = "Hello, World!" 
     self.fontSize = 65; 
     self.position = CGPoint(x: 400, y: 500); 
    } 
} 

class GameScene: SKScene { 
    override func didMoveToView(view: SKView) { 
     /* Setup your scene here */ 
//  let myLabel = SKLabelNode(fontNamed:"Chalkduster") 
//  myLabel.text = "Hello, World!"; 
//  myLabel.fontSize = 65; 
//  myLabel.position = CGPoint(x: 400, y: 500); 

     let myLabel = HelloLabel(fontNamed: "Chalkduster") 
     self.addChild(myLabel) 
    } 

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
     /* snip, no changes made here */ 
    } 

    override func update(currentTime: CFTimeInterval) { 
     /* snip, no changes made here */ 
    } 
} 

Quindi, HelloLabel è destinato di essere solo un pass-through, nel tentativo di capire come legare tutto insieme, ma quando faccio funzionare l'applicazione, ottengo il seguente errore:

/Users/jon/Projects/ErrorExample/ErrorExample/GameScene.swift: 11: 11: fatal error: use of unimplemented initializer 'init()' for class 'ErrorExample.HelloLabel' 

non sto capire cosa questo messaggio sta cercando di dirmi . Il modo in cui leggo questo errore è che si lamenta che non ho implementato un inizializzatore chiamato init nella classe ErrorExample.HelloLabel, ma sicuramente sembra che io abbia me!

Quindi, cosa sto facendo male qui - come si estrae una classe per nascondere tutto questo setup?

risposta

11

Io non sono certo esattamente perché, ma la funzionalità nascosta all'interno SKLabelNode stava cercando di chiamare una funzione init senza parametri. Questo sembra funzionare:

class HelloLabel: SKLabelNode { 
    init() { 
     super.init() 
    } 

    init(fontNamed fontName: String!) { 
     super.init(fontNamed: fontName) 
     self.text = "Hello, World!" 
     self.fontSize = 65; 
     self.position = CGPoint(x: 400, y: 500); 
    } 
} 
+0

Awesome, grazie per l'aiuto !! :) – jonallured

0

Forse dal momento che la superclasse si aspetta che un NSString* modificando init(fontNamed: String) { a init(fontNamed: NSString) { risolverà il problema?

Oppure un'altra possibilità potrebbe utilizzando l'obj-c bridging:

init(fontNamed: String) { 
    super.init(fontNamed: fontNamed.bridgeToObjectiveC()) 
    ... 
} 
+0

Grazie Jiaaro, ma quando aggiungo quella parola chiave, allora ottengo questo errore: 'Override' non è valido su questa dichiarazione. – jonallured

+0

oh sei al 100% giusto - init non richiede 'override' – Jiaaro

+0

@jonallured ok forse è una cosa di tipo - dal momento che il tipo dell'argomento è un 'String' e la superclasse si aspetta un' NSString * ' – Jiaaro

-1

È necessario eseguire prima l'inizializzazione della classe e dopo l'inizializzazione della superclasse. Così il vostro init() dovrebbe assomigliare a questo:

init(fontNamed: String) { 
     self.text = "Hello, World!" 
     self.fontSize = 65; 
     self.position = CGPoint(x: 400, y: 500); 
     super.init(fontNamed: fontNamed) 
    } 

E 'a causa di sicurezza e stato spiegato in seduta 403 del WWDC, Intermedio Swift.

+1

Grazie a Cojoj, ma questo non funziona perché avrai un errore che hai usato 'text' prima di chiamare' init'. Devi prima 'super.init'. – jonallured

2

Questo sembra funzionare meglio:

class LinkLabel: SKLabelNode { 

    override init() { 
     super.init() 
    } 

    override init(fontNamed fontName: String!) { 
     super.init(fontNamed: fontName) 
     self.text = "Hello, World!" 
     self.fontSize = 65; 
     self.position = CGPoint(x: 400, y: 500); 
    } 

    required init(coder aDecoder: NSCoder!) { 
     super.init() 
    } 

} 
Problemi correlati