我做了一个小操场,用自定义对象对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<User> = [user1, user2, user3]
let userSet2 : Set<User> = [user4, user5, user6]
但是当我做这样的操作时:
let newSet = userSet1.subtract(userSet2)
print(newSet)
newSet
与userSet1
相同,并且没有任何集合被修改。
我该怎样做才能让这些设置操作起作用?
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
答案 0 :(得分:3)
您无法自己决定使用什么作为哈希值。可持续性的要求是:如果这两个对象相等,则两个对象的哈希值必须是相同。
您提供了一个哈希值算法,但您没有做任何关于使您的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的工作原理。