【发布时间】:2015-10-10 17:34:37
【问题描述】:
我做了一个小操场,对自定义对象的 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
【问题讨论】:
-
提示:在返回之前登录
NSString(string: id).integerValue,看看你是否成功满足哈希性要求。 -
但是根据我的hashValue,他们确实有共同的成员
-
我更新了
hashValue计算并添加了一些打印,您可以看到其中一些匹配hashValues,但操作仍然无法正常工作 -
到达那里。但散列值并不是散列性的唯一要求。对哈希性有什么要求?有一个简单的规则,你仍然没有遵守它。