问题描述
原谅我,我以前可能会问过这个问题,但是它以不同的方式打给了我,并且仍然在学习Swift
在我的主场景中,我可以轻松地初始化一个节点,然后根据需要对其进行操作:
let myGSlot = SKSpriteNode(color : .green,size: CGSize(width: 100.0,height: 100.0))
但是,当我尝试对其进行子类化时:
class GuessSlot : SKSpriteNode{
init(color: SKColor,size: CGSize) {
super.init()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
无论我做什么,编辑器都会给我带来很多错误。主要的是:
必须调用超类“ SKSpriteNode”的指定初始化程序 我将其放在 init()还是 super.init()
我知道我是Swift的新手,但这真使我丧命!
*********最新更新,也是我将其编译的唯一方法,但仍然因错误而崩溃:
线程1:EXC_BAD_ACCESS(代码= 2,地址= 0x7ffeec64aff0)
在调试器中,我看到参数的值为零
convenience init(color: SKColor,size: CGSize) {
self.init(color: color,size: size)
}
当我看到所有线程对此信息感到困惑时,我的确感到不那么傻
解决方法
在Swift中,您需要调用一个直接从您的超类(在本例中为SKSpriteNode)实现的初始化程序。 super.init()
由SKSpriteNode继承树中的另一个类(如SKNode或NSObject)实现。您始终可以检查documentation,可以为每个类调用哪些构造函数。重要的是要了解您需要在子类中调用指定的初始化程序
例如,您可以
class GuessSlot : SKSpriteNode{
init(color: SKColor,size: CGSize) {
super.init(texture: nil,color: color,size: size)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
,
我不确定断开连接的位置,但是如注释中所述,您只需要覆盖适当的指定初始化纹理,颜色,大小即可。
class TestSpriteNode : SKSpriteNode{
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override init(texture: SKTexture?,color: UIColor,size: CGSize) {
super.init(texture: texture,color:color,size:size)
}
}
这将使您可以访问父类的所有init。
您现在可以执行var s = TestSpriteNode(color:.red,size:CGSize(width:1,height:1))
如果您需要覆盖此便利初始化,则需要引用您覆盖的指定初始化之一,而不是便利初始化。
class TestSpriteNode : SKSpriteNode{
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override init(texture: SKTexture?,size:size)
}
convenience init(color: UIColor,size: CGSize) {
self.init(texture: nil,size:size)
}
}