使用Swift子类化SKLabelNode错误
我有下面的类,它是SKLabelNode的一个子类。这门课没有老师是不行的使用Swift子类化SKLabelNode错误,swift,sprite-kit,Swift,Sprite Kit,我有下面的类,它是SKLabelNode的一个子类。这门课没有老师是不行的 override init(){ super.init() } 打电话。似乎SKLabelNode正在尝试调用一个没有参数的init()方法,或者是在某个地方发生了导致此问题的其他事情 这是简化的类 import UIKit import SpriteKit class PulsatingText: SKLabelNode { override init(){ sup
override init(){
super.init()
}
打电话。似乎SKLabelNode正在尝试调用一个没有参数的init()方法,或者是在某个地方发生了导致此问题的其他事情
这是简化的类
import UIKit
import SpriteKit
class PulsatingText: SKLabelNode {
override init(){
super.init()
}
init (fontNamed:String!, theText: String!, theFontSize: CGFloat!){
super.init(fontNamed: fontNamed)
self.text = theText
self.fontSize = theFontSize
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
如果我移除
override init(){
super.init()
}
我得到一个运行时崩溃,以下错误被记录到控制台
致命错误:对类“MobileTutsInvaderz.pulsingText”使用未实现的初始值设定项“init()”
下面是我调用该方法的方式
让InvesterText=脉动文字(字体名为:“粉笔”,文字名为“InvesterZ”,字体大小:50)
我还包括下面的堆栈跟踪图像
您需要初始化
init()
方法。因为每次初始化SKLabelNode
时都会调用默认的init()
方法。您可以通过实现override init()
并添加println
语句来测试它,如下所示:
override init() {
super.init()
println("test")
}
var label:PulsatingText = PulsatingText(fontNamed: "Arial", theText: "hey", theFontSize: 12)
如果现在初始化这样的labelnode:
override init() {
super.init()
println("test")
}
var label:PulsatingText = PulsatingText(fontNamed: "Arial", theText: "hey", theFontSize: 12)
println(“test”)
将被调用。因为您只想添加便利性
初始值设定项,其余的保持不变,所以不需要覆盖指定的初始值设定项。因此,只需如下更改代码:
class PulsatingText: SKLabelNode {
convenience init (fontNamed:String!, theText: String!, theFontSize: CGFloat!){
self.init(fontNamed: fontNamed)
self.text = theText
self.fontSize = theFontSize
}
}
SKLabelNode
的默认初始值设定项是init(fontNamed fontName:String!)
,您是否尝试重写它?您能显示调用该类的代码吗?@我听到帖子显示我正在调用该类。@NikitaIvaniushchenko我也没有尝试重写它不,您在该类中看到的就是它。这给出了一个错误,事实上,我做的不止这些。我简化了init方法。为了弄清调用super.init()的原因,您使用的XCode版本是什么?我使用6.2。您可以添加错误吗?Xcode 12.2给出了这个错误:PulsingText的便利初始值设定项必须委托(使用'self.init'),而不是链接到超类初始值设定项(使用'super.init')
最终调用init是有意义的,但奇怪的是它调用init()你能解释一下为什么它会调用子类init()方法吗。?我试图理解为什么它是这样工作的。谢谢,我同意这看起来很奇怪。有时斯威夫特不遵守常识。