【问题标题】:Swift: Overriding method has incompatible typeSwift:覆盖方法具有不兼容的类型
【发布时间】:2015-07-28 19:07:32
【问题描述】:

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

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

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

敌人类中的行会导致错误。奇怪的是,我找到了几个修复程序,但我不知道他们为什么要修复它。

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

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

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

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

【问题讨论】:

标签: swift sprite-kit core-graphics skspritenode


【解决方案1】:

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

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

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

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

请参阅this question 了解更多解释和上下文。

【讨论】:

  • 这是有道理的。谢谢:)
猜你喜欢
  • 1970-01-01
  • 2015-04-30
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 2011-03-09
  • 1970-01-01
相关资源
最近更新 更多