Переопределенная функция == для типа Equatable, не вызываемого для пользовательского класса, который подклассов NSCoding и NSObject
FooBar
класс ниже должен переопределить ==
функция Equatable
тип.
Тем не менее, призывая contains
на массиве FooBar
объекты не вызывают точку останова внутри кастома ==
функция для вызова. Возможно ли другое ==
функция переопределяет эту пользовательскую?
Примечание. Поскольку FooBar должен создавать подклассы из NSCoding и NSObject, FooBar не перечисляет Equatable как протокол, потому что он вызывает эту ошибку:
Резервное соответствие 'FooBar' протоколу 'Equatable'
func ==(lhs: FooBar, rhs: FooBar) -> Bool {
return lhs.id == rhs.id
}
class FooBar: NSObject, NSCoding {
// Class def
}
// Both serverFooBars and gFooBars are [FooBar]
let newFooBars = serverFooBars.filter { !gFooBars.contains($0) }
2 ответа
Потому что ваш класс наследует от NSObject
вам не нужно использовать протокол Swift Equatable
вместо этого вы должны переопределить NSObject
метод isEquals
:
Swift 3.x
class FooBar: NSObject, NSCoding {
override func isEqual(_ object: Any?) -> Bool {
return id == (object as? FooBar)?.id
}
}
(Спасибо Камчатке)
Swift 2.x
class FooBar: NSObject, NSCoding {
override func isEqual(object: AnyObject?) -> Bool {
return id == (object as? FooBar)?.id
}
}
Вы получаете эту ошибку, потому что NSObject уже соответствует Equatable через его метод isEqual.
Так что я не уверен, что это правильный способ сделать это, но вы можете переопределить метод isEqual для NSObject:
class FooBar: NSObject, NSCoding {
...
override func isEqual(object: AnyObject?) -> Bool {
return self == (object as? FooBar)
}