冗余一致性错误消息Swift 2

Kha*_*yen 50 xcode swift

我将我的项目更新为Swift 2,并收到了一堆redundant conformance of XXX to protocol YYY.当一个类符合时,这种情况经常(或总是)发生CustomStringConvertible.还有一些地方Equatable.

class GraphFeatureNumbersetRange: GraphFeature, CustomStringConvertible { // <--- get the error here
...
}
Run Code Online (Sandbox Code Playgroud)

我怀疑在实现时var description: String { get },或者协议所需的任何方法,我都不需要明确地遵守协议.我应该遵循fixit说明并删除所有这些吗?如果一个类实现了所有协议的方法,Swift现在会自动推断出一致性吗?

Mar*_*n R 92

如果子类声明对已经从超类继承的协议的一致性,那么您将在Xcode 7(Swift 2)中获得该错误消息.例:

class MyClass : CustomStringConvertible {
    var description: String { return "MyClass" }
}

class Subclass : MyClass, CustomStringConvertible {
    override var description: String { return "Subclass" }
}
Run Code Online (Sandbox Code Playgroud)

错误日志显示:

main.swift:10:27: error: redundant conformance of 'Subclass' to protocol 'CustomStringConvertible'
class Subclass : MyClass, CustomStringConvertible {
                          ^
main.swift:10:7: note: 'Subclass' inherits conformance to protocol 'CustomStringConvertible' from superclass here
class Subclass : MyClass, CustomStringConvertible {
      ^

从子类声明中删除协议一致性可以解决问题:

class Subclass : MyClass {
    override var description: String { return "Subclass" }
}
Run Code Online (Sandbox Code Playgroud)

但是超类必须明确声明一致性,它不会从description 属性的存在中自动推断出来.

  • 在我的实例中,我很乐意使用override关键字,但Xcode对覆盖重载运算符(== for Equatable)感到不满.有任何想法吗? (2认同)

Chr*_*lay 6

对于googlers,当我在Tests目标中包含SwiftyJson并添加一个swift测试类时,我也遇到了这个错误,因为它导致SwiftyJson再次被编译,并且它将NSNumber声明为Comparable.解决方案是仅将其包含在app目标中.

  • 这个答案帮助我意识到我将被测试的源文件添加为我的应用程序和测试目标的成员。删除它作为测试目标的成员解决了错误。奇怪的是,在这种情况下,错误突然出现了很长时间。我不确定触发因素是什么,因为我已经在之前的所有权设置上运行了很长时间的测试(也非常相似)。 (2认同)