2016-05-10 13 views
6

Abbiamo una classe semplice Person che è inerente ai reami Object. Ora vogliamo che la sottoclasse sia conforme al protocollo Equatable. Il codice molto semplice assomiglia a questo.RealmObject Messaggio ridondante equabile

class Person: Object, Equatable { 

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

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

    return lhs.localID == rhs.localID 
} 

Abbiamo iniziato con la versione 0.98.8 del dominio e tutto ha funzionato come previsto. Quando abbiamo aggiornato alla versione 0.102.0 (e le altre versioni tra) il messaggio di errore si verifica complier

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

Non abbastanza strano, se il downgrade di nuovo alla versione 0.98.8 l'errore rimane. Un altro strano comportamento, su uno dei nostri sviluppatori, lo stesso codice compila bene.

Dopo alcune ricerche non abbiamo idea di cosa sta succedendo e di come risolvere o risolvere questo problema.

+0

Sto avendo questo problema esatto! Grazie per aver postato questa domanda. Stavo ottenendo la conformità ridondante dall'implementazione di Hashable. Alcuni dei miei compagni di squadra stavano bene e altri stavano ottenendo l'errore. – Atticus

risposta

7

Ultima versione di RealmSwift attrezzi Equatable per impostazione predefinita, si può guardare Object.swift da RealmSwift codice.

Per ignorare predefinita Equatable comportamento, è possibile ignorare questa funzione:

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

Dopo di che, il codice Swift esistente con == risultato tornerà sulla base di condizioni personalizzato definito all'interno isEqual. Non è necessario creare func == manualmente.

Sta ancora utilizzando isEqual a causa di RLMObjectBase sottoclasse da NSObject, non puro oggetto Swift.

+0

Grazie! Funziona in questo modo. –

0

In RealmSwift, Object è già conforme a Equatable. Quindi non devi aggiungere lo Equatable nella definizione di Person.

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

+0

Questo è stato il nostro primo suggerimento. Ma se rimuoviamo il protocollo Equatable dalla classe Person, il controllo equatoriale non viene mai chiamato. Anche l'oggetto Realm eredita da RLMObjectBase e RLMObjectBase da NSObject. Non vi è alcuna conformità con l'Equitable –

0

La firma aggiornata per Swift 4 è:

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