在 Swift 中覆盖 Equatable 和 Hashable
Posted
技术标签:
【中文标题】在 Swift 中覆盖 Equatable 和 Hashable【英文标题】:Override Equatable and Hashable in Swift 【发布时间】:2019-06-02 00:07:13 【问题描述】:有没有办法覆盖 NSManagedObject 的 Equatable?我有一个包含 300k 个对象的 coredata 数据集,我需要根据对象的业务 ID 删除重复项。
// Coredata NSManagedObject
import Foundation
import CoreData
@objc(Business)
public class Business: NSManagedObject
覆盖错误消息:
【问题讨论】:
相关:***.com/questions/33319959/… 【参考方案1】:NSManagedObject
已经声明它符合Equatable
和Hashable
。无需添加: Equatable
。
您需要直接在 Business
类中覆盖关联的方法,而不使用扩展。
【讨论】:
需要实现的是==
,还是NSObjectProtocol.isEqual(_:)
?我永远记不清了【参考方案2】:
既然NSManagedObject
已经符合Equatable
,那你为什么还要再去符合它呢? :)
只需覆盖==
函数,您就可以开始了!
extension Business
static func == (lhs: Business, rhs: Business) -> Bool
print("custom equation has been called")
return lhs.id == rhs.id
你可以这样测试:
var b1 = Business()
var b2 = Business()
b1.id = "1"
b2.id = "2"
print("b1 == b2 ? \(b1 == b2)")
打印出来的结果证明你的自定义==
函数被调用了。
custom equation has been called
b1 == b2 ? false
【讨论】:
这是无效的。您还需要覆盖func hash(into:)
的实现,否则您将违反Hashable
的约定(即相等的值具有相等的哈希值)
Methods and Properties You Must Not Override checkout above 链接,它说你不能在 NSManagedObject 中覆盖 ==。此外,如果您想要独特的结果,这样的事情也会很有用。 developer.apple.com/documentation/coredata/nsfetchrequest/…
通过扩展覆盖方法是不好的做法,因为不清楚将执行什么;原件或扩展件。以上是关于在 Swift 中覆盖 Equatable 和 Hashable的主要内容,如果未能解决你的问题,请参考以下文章
通过扩展自动合成 Swift 结构或枚举的 Equatable 一致性