RealmObject Equatable 冗余消息

Posted

技术标签:

【中文标题】RealmObject Equatable 冗余消息【英文标题】:RealmObject Equatable redundant message 【发布时间】:2016-05-10 06:48:19 【问题描述】:

我们有一个简单的类Person,它来自领域Object。 现在我们希望该子类符合Equatable 协议。非常简单的代码如下所示。

class Person: Object, Equatable 

    dynamic var localID     = "0"
    dynamic var name:String?


func ==(lhs: Person, rhs: Person) -> Bool 

    return lhs.localID == rhs.localID

我们从领域版本 0.98.8 开始,一切正常。当我们更新到版本 0.102.0(以及其他版本)时,会出现编译器错误消息

Error: Redundant conformance of ‚Person‘ to protocol ‚Equatable‘

不足为奇,如果降级回 0.98.8 版,错误仍然存​​在。另一个奇怪的行为,在我们的一台开发人员机器上,相同的代码编译得很好。

经过一些研究,我们不知道发生了什么以及如何修复或解决此问题。

【问题讨论】:

我遇到了这个问题!感谢您发布这个问题。我从实现 Hashable 中获得了多余的一致性。我的一些队友很好,而其他人则遇到了错误。 【参考方案1】:

最新版RealmSwift默认实现Equatable,可以从RealmSwift代码中查看Object.swift

要覆盖默认的Equatable 行为,您可以覆盖此函数:

public override func isEqual(object: AnyObject?) -> Bool

之后,带有== 的现有Swift 代码将根据isEqual 中定义的自定义条件返回结果。无需手动创建func ==

它仍在使用isEqual,因为RLMObjectBaseNSObject 的子类,而不是纯Swift 对象。

【讨论】:

【参考方案2】:

Swift 4 的更新签名是:

open override func isEqual(_ object: Any?) -> Bool 
    return true

【讨论】:

【参考方案3】:

RealmSwift 中,Object 已经符合Equatable。所以您不必在Person 的定义中添加Equatable

But you do not seem to be the only one having problems with this.

【讨论】:

这是我们的第一个建议。但是,如果我们从 Person 类中删除 Equatable 协议,则永远不会调用 equatable 检查。此外,Realm Object 继承自 RLMObjectBase,RLMObjectBase 继承自 NSObject。根本不符合 Equatable

以上是关于RealmObject Equatable 冗余消息的主要内容,如果未能解决你的问题,请参考以下文章

冗余一致性错误消息 Swift 2

题解 bzoj1923: [Sdoi2010]外星千足虫 (线性基/高斯消元)

如何使用android [关闭]获取RealmObject中的最后一个修改过的RealmObject或字段

RealmObject 的 Kotlin 数据类

启动 Xamarin Forms Android 应用程序时未找到 RealmObject

错误:任务“:app:compileDebugJavaWithJavac”执行失败。 > 扩展 RealmObject 类后编译失败