冗余一致性错误消息 Swift 2

Posted

技术标签:

【中文标题】冗余一致性错误消息 Swift 2【英文标题】:Redundant conformance error message Swift 2 【发布时间】:2015-06-16 12:43:49 【问题描述】:

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

class GraphFeatureNumbersetRange: GraphFeature, CustomStringConvertible  // <--- get the error here
...

我怀疑当我实现var description: String get 或协议要求的任何方法时,我不需要显式地遵守协议。我应该按照 fixit 说明并删除所有这些吗?如果一个类实现了协议的所有方法,Swift 现在会自动推断一致性吗?

【问题讨论】:

“我怀疑我不需要明确遵守协议”……这是不正确的。如果你想与一个协议交互,你必须明确地遵守它。 “我应该按照 fixit 说明进行操作吗?” 您需要为您的问题添加更多详细信息,以便我们重现该问题。 “如果一个类实现了协议的所有方法,Swift 现在会自动推断一致性吗?” 不会。 @0x7fffffff CustomStringConvertible 是 Swift 2 中的新协议 - see here。不确定GraphFeature @AaronBrager:不是很新,只是从Printable重命名。 【参考方案1】:

如果子类声明符合性,您将在 Xcode 7 (Swift 2) 中收到该错误消息 到已经从超类继承的协议。示例:

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


class Subclass : MyClass, CustomStringConvertible 
    override var description: String  return "Subclass" 

错误日志显示:

main.swift:10:27:错误:“子类”与协议“CustomStringConvertible”的冗余一致性 类子类:MyClass,CustomStringConvertible ^ main.swift:10:7:注意:“子类”从此处的超类继承对协议“CustomStringConvertible”的一致性 类子类:MyClass,CustomStringConvertible ^

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

class Subclass : MyClass 
    override var description: String  return "Subclass" 

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

【讨论】:

在我的例子中,我很想使用 override 关键字,但是 Xcode 对覆盖重载的运算符(== 表示 Equatable)感到恐惧。有什么想法吗? 不需要使用 override 关键字。请参阅developer.apple.com/library/prerelease/ios/documentation/Swift/…中的“等价运算符”一节 @MaxMacLeod 如果不使用 override 关键字,您如何确保调用 == 的自定义实现? ***.com/questions/37085839/… 那么它实际上继承了哪个类,我的意思是继承CustomDebugStringConvertible的类【参考方案2】:

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

【讨论】:

您可能无法仅为当前应用程序(而不是测试)设置文件的目标。如果发生这种情况,请将文件分成两个文件,一个包含冗余协议一致性(仅使其成为当前目标),另一个包含其余代码(将其目标设置为您的应用和应用测试)。 这个答案帮助我意识到我已将正在测试的源文件添加为我的应用程序和测试目标的成员。将其作为测试目标的成员删除解决了该错误。奇怪的是,在这种情况下出现了很长时间之后,错误突然出现了。我不确定触发因素是什么,因为我已经在之前的所有权设置中运行了很长时间的测试(也非常相似)。【参考方案3】:

关键是您的 GraphFeatureNumbersetRange 是 NSObject 的 子类。 这又已经 符合CustomStringConvertible!就是这样!只需删除此冗余协议即可。现在你要声明它两次! :-)

【讨论】:

以上是关于冗余一致性错误消息 Swift 2的主要内容,如果未能解决你的问题,请参考以下文章

错误:“ViewController”与扩展协议的冗余一致性

Openstack Swift 原理架构与 API 介绍

导入外部库后具有 UINavigationControllerDelegate 的 ViewController 中出现冗余一致性错误

“TableViewController”与协议“UITableViewDataSource”的冗余一致性[重复]

OpenTok/TokBox 的 Swift 协议一致性错误

多种协议的 Swift 类一致性(XCode 7、iOS 9、Swift 2.1)