2016-05-10 9 views
6

レルムに固有の簡単なクラスPersonを持っていますObject。 サブクラスがEquatableプロトコルに準拠するようにします。非常に単純なコードは次のようになります。RealmObject等価冗長メッセージ

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にダウングレードする場合は、エラーがまだ残っています。別の奇妙な振る舞いは、私たちの開発者のマシンでは、同じコードがうまくコンパイルされます。

調査の結果、何が起こっているのか、またこれを修正する方法や回避する方法がわからないことがあります。

+0

私はこの正確な問題を抱えています!この質問を投稿していただきありがとうございます。私はHashableの実装から冗長な適合を得ていました。私のチームメイトの一部は問題なく、他のチームメイトはエラーを受けていました。 – Atticus

答えて

7

デフォルトでRealmSwift道具Equatableの最新版、あなたはRealmSwiftコードからObject.swiftを見ることができます。デフォルトEquatable動作をオーバーライドする

、あなたがこの機能を無効にすることができます:その後

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

を、==でスウィフトコードを既存のisEqual内で定義されたカスタム条件に基づいて結果を返します。手動でfunc ==を作成する必要はありません。

RLMObjectBaseNSObjectからサブクラス化されているため、まだisEqualが使用されています。純粋なSwiftオブジェクトではありません。

+0

ありがとう!このように働いています。 –

0

RealmSwiftにおいて、ObjectはすでにEquatableに準拠しています。したがって、EquatablePersonの定義に追加する必要はありません。

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

+0

これは私たちの拳の提案でした。しかし、PersonクラスからEquatableプロトコルを削除すると、等価チェックは決して呼び出されません。また、Realmオブジェクトは、NSObjectからRLMObjectBaseおよびRLMObjectBaseを継承します。 Equatableにすべての適合はありません –

0

スウィフト4の更新されたシグネチャは次のとおりです。

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