我今天遇到了一个非常奇怪的错误。这段代码被剥离到最低限度,但它应该足够了:
class Sprite: SKSpriteNode {
func setup(pos: CGPoint) {}
}
class Enemy: Sprite {
func setup(health: Int) {}
}
敌人类中的行导致错误。奇怪的是,我发现了一些修复,但我不知道为什么要修复它。
第一个修复:不要让Sprite继承SpriteKit类。删除它或将SKSpriteNode更改为NSEvent之类的随机内容可以修复错误。
其次:将pos:的参数类型更改为我自己定义的类或添加更多参数。
最后:将健康参数类型更改为我自己定义的类或添加更多参数。将类型更改为String,CGSize或类似的东西不能解决错误。
在我目前的代码中,Enemy.setup需要的参数多于健康,所以这不是一个真正的问题,但我很好奇是什么导致错误以及为什么添加更多参数或更改Sprite的父类解决它。
答案 0 :(得分:1)
当子类化Objective-C对象时,不能有两个具有相同选择器名称的不同方法。这两种方法都转化为setup:
。如果有人在setup:
上调用了Enemy
选择器,则不清楚要使用哪种实现方式。 Objective-C会将这些方法视为具有相同的名称,但由于类型不同,Swift会对它们进行不同的处理。
以不同方式命名它们是最简单的解决方案:
class Sprite: SKSpriteNode {
func configurePosition(pos: CGPoint) {}
}
class Enemy: Sprite {
func configureHealth(health: Int) {}
}
有关更多说明和背景信息,请参阅this question。