2014-06-06 16 views
6

Ich bin sehr neu in der iOS-Entwicklung, aber ich habe mit der SpriteKit Template-App herumgespielt, um zu lernen, wie die Dinge funktionieren, und versuche, Swift zu booten, während ich dabei bin. Eine Sache, mit der ich Probleme habe, ist, wie man mit SpriteKit-Unterklassen arbeitet.Unterklasse SpriteKit-Klassen in Swift

ich in der GameScene.swift Datei bin und ich versuche, eine Klasse für das „Hallo Welt“ Etikett zu extrahieren, also hier, was die Datei wie folgt aussieht:

// 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 */ 
    } 
} 

Also, HelloLabel gedacht nur ein Pass-Through in einem Versuch, zu verstehen, wie alles Drähte zusammen, aber wenn ich die App laufen, ich folgende Fehlermeldung erhalten:

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

ich bin nicht zu verstehen, was diese Nachricht mir versucht zu sagen, . Die Art, wie ich diesen Fehler gelesen habe, ist, dass er sich beschwert, dass ich keinen Initialisierer namens init in der Klasse ErrorExample.HelloLabel implementiert habe, aber es sieht so aus, als ob ich zu mir hätte!

Also, was mache ich hier falsch - wie extrahiert man eine Klasse, um all diese Einstellungen zu verbergen?

Antwort

11

Ich bin nicht genau sicher, warum, aber die versteckte Funktionalität innerhalb SKLabelNode wurde versucht, eine init-Funktion ohne Parameter aufzurufen. Das scheint zu funktionieren:

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

Ehrfürchtig, danke für die Hilfe!! :) – jonallured

0

Vielleicht, da die Oberklasse erwartet NSString* Änderung init(fontNamed: String) { zu init(fontNamed: NSString) { wird das Problem lösen?

Oder eine andere Möglichkeit könnte die obj-c Überbrückung durch den Einsatz:

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

Dank Jiaaro, aber wenn ich das Keyword hinzufügen, dann bekomme ich diese Fehlermeldung: ‚Überschreibung‘ auf dieser Erklärung nicht gültig ist. – jonallured

+0

oh Sie sind zu 100% richtig - init erfordert keine 'override' – Jiaaro

+0

@jonallured ok vielleicht ist es eine Art Sache - da der Typ des Arguments ist eine' String' und die Oberklasse erwartet eine 'NSString *' – Jiaaro

-1

Sie müssen zuerst Ihre Klasseninitialisierung durchführen und danach die Superklasse initialisieren. So Ihr init() soll wie folgt aussehen:

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

Es ist wegen der Sicherheit und wurde in der Sitzung 403 von WWDC, Intermediate Swift erklärt.

+1

Danke Cojoj, aber das funktioniert nicht, weil Sie einen Fehler bekommen, dass Sie 'text' verwendet haben, bevor Sie' init' aufgerufen haben. Sie müssen zuerst "super.init". – jonallured

2

Das scheint besser zu funktionieren:

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

} 
Verwandte Themen