在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课中进行了解释。