RealmObject Equatable избыточное сообщение

У нас есть простой класс 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, ошибка все равно останется. Еще одно странное поведение на одном из наших разработчиков: тот же код компилируется просто отлично.

После некоторых исследований мы понятия не имеем, что происходит и как это исправить или обойти.

3 ответа

Решение

Последняя версия RealmSwift инвентарь Equatable по умолчанию вы можете посмотреть на Object.swift от RealmSwift код.

Для переопределения по умолчанию Equatable поведение, вы можете переопределить эту функцию:

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

После этого существующий код Swift с == вернет результат на основе пользовательского условия, определенного внутри isEqual, Не нужно создавать func == вручную.

Это все еще использует isEqual из-за RLMObjectBase подкласс от NSObject, не чистый объект Swift.

Обновленная подпись для Swift 4:

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

В RealmSwift, Object уже соответствует Equatable, Так что вам не нужно добавлять Equatable в определении Person,

Но вы, похоже, не единственный, у кого проблемы с этим.

Другие вопросы по тегам