Swift:重写方法具有不兼容的类型

时间:2015-07-28 19:07:32

标签: swift sprite-kit core-graphics skspritenode

我今天遇到了一个非常奇怪的错误。这段代码被剥离到最低限度,但它应该足够了:

class Sprite: SKSpriteNode {
    func setup(pos: CGPoint) {}
}

class Enemy: Sprite {
    func setup(health: Int) {}
}

敌人类中的行导致错误。奇怪的是,我发现了一些修复,但我不知道为什么要修复它。

第一个修复:不要让Sprite继承SpriteKit类。删除它或将SKSpriteNode更改为NSEvent之类的随机内容可以修复错误。

其次:将pos:的参数类型更改为我自己定义的类或添加更多参数。

最后:将健康参数类型更改为我自己定义的类或添加更多参数。将类型更改为String,CGSize或类似的东西不能解决错误。

在我目前的代码中,Enemy.setup需要的参数多于健康,所以这不是一个真正的问题,但我很好奇是什么导致错误以及为什么添加更多参数或更改Sprite的父类解决它。

1 个答案:

答案 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