您必须做什么才能使设置操作适用于自定义对象?

我做了一个小游乐场,用自定义对象对Set操作进行一些测试,但它们仍然失败,我不明白为什么。

class User: NSObject { let id: String init(id: String) { self.id = id super.init() } override var hashValue: Int { get { return id.hashValue } } override var description: String { get { return id } } } func ==(lhs: User, rhs: User) -> Bool { return lhs.hashValue == rhs.hashValue } 

然后,我制作了两组User对象:

 let user1 = User(id: "zach") let user2 = User(id: "john") let user3 = User(id: "shane") let user4 = User(id: "john") let user5 = User(id: "shane") let user6 = User(id: "anthony") let userSet1 : Set = [user1, user2, user3] let userSet2 : Set = [user4, user5, user6] 

但是当我做这样的操作时:

 let newSet = userSet1.subtract(userSet2) print(newSet) 

newSetnewSet相同,并且没有修改任何集合。

我该怎么做才能让这些设置操作起作用?

 id:zach -> 4799450060450308971 id:john -> 4799450060152454338 id:shane -> -4799450060637667915 id:john -> 4799450060152454338 id:shane -> -4799450060637667915 id:anthony -> 4799450059843449897 id:shane -> -4799450060637667915 id:anthony -> 4799450059843449897 id:john -> 4799450060152454338 

您无法自己决定将什么用作哈希值。 可持续性的要求是:如果这两个对象相等 ,则两个对象的哈希值必须相同

您已经提供了一个哈希值算法,但是您没有做任何关于使您的User对象的可公性与之匹配。

这是一个可以在一个集合中加载的User对象:

 func ==(lhs:User, rhs:User) -> Bool { return lhs.id == rhs.id } class User: Hashable, CustomStringConvertible { let id: String init(id: String) { self.id = id } var hashValue: Int { return id.hashValue } } 

观察我已经删除了使这个东西也成为NSObject的复杂性。 如果你想这样做,事情会有所不同; 你需要考虑NSObject的工作原理。