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

Swift: Overriding method has incompatible type

我今天遇到了一个非常奇怪的错误。此代码已精简到最低限度,但应该足够了:

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

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

敌人class内部的线导致错误。奇怪的是,我找到了几个修复程序,但我不知道它们为什么修复它。

第一个修复:不要让 Sprite 继承 SpriteKit class。删除它或将 SKSpriteNode 更改为随机的东西,如 NSEvent 修复错误。

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

最后:更改参数类型 health: 为 class 我自己定义或添加更多参数。将类型更改为 String、CGSize 或类似内容并不能解决错误。

在我当前的代码中,Enemy.setup 接受的参数不仅仅是健康,所以这不是真正的问题,但我很好奇是什么导致了错误以及为什么要添加更多参数或更改Sprite 的父 class 修复了它。

子类化 Objective-C 对象时,不能有两个具有相同选择器名称的不同方法。这两种方法都转换为 setup:。如果有人在 Enemy 上调用 setup: 选择器,将不清楚使用哪个实现。 Objective-C 会将这些方法视为具有相同的名称,但 Swift 会因为类型差异而将它们区别对待。

以不同的方式命名是最简单的解决方案:

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

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

有关更多解释和上下文,请参阅