在Swift中inheritanceSpriteKit类

我对iOS开发非常陌生,但是我一直在玩SpriteKit模板应用程序来学习如何工作,并尝试在Swift上启动。 我遇到的一件事是如何使用SpriteKit子类。

我在GameScene.swift文件中,我试图为“Hello World”标签提取一个类,所以下面是这个文件的样子:

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

所以, HelloLabel只是为了试图理解所有东西是如何连接在一起的,而当我运行这个应用程序时,我得到了下面的错误:

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

我不明白这个消息是想告诉我什么。 我读这个错误的方式是抱怨说,我没有在类ErrorExample.HelloLabel实现一个名为init的初始化ErrorExample.HelloLabel ,但它确实看起来像我不得不!

所以,我在这里做错了什么 – 如何提取一个类来隐藏所有这些设置?

我不确定为什么,但SKLabelNode内的隐藏function是试图调用一个没有参数的初始化函数。 这似乎工作:

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

这似乎更好地工作:

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

也许因为超类预计NSString*更改init(fontNamed: String) {init(fontNamed: NSString) {将解决问题?

或者另一种可能性可以通过使用obj-c桥接来实现:

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

你必须先做你的类初始化,然后初始化超类。 所以你的init()应该是这样的:

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

这是出于安全考虑,并在WWDC 中级Swift的 403课中进行了解释。