为什么我无法继承SKSpriteNode

问题描述

原谅我,我以前可能会问过这个问题,但是它以不同的方式打给了我,并且仍然在学习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)
        }

当我看到所有线程对此信息感到困惑时,我的确感到不那么傻

creating an SKSpriteNode that's not subclassed

解决方法

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