平常,我們判斷兩個對象是否相等可以用==
示例:
class AA:NSObject {
let id:String
init(id:String) {
self.id = id
super.init();
}
}
let a1 = AA(id: "2")
let a2 = AA(id: "2")
結(jié)果:
a1 == a2
//結(jié)果:false,因?yàn)楸緛砭褪莾蓚€對象
這里重寫
override func isEqual(_ object: Any?) -> Bool
class AA:NSObject {
let id:String
init(id:String) {
self.id = id
super.init();
}
override func isEqual(_ object: Any?) -> Bool {
guard let other = object as? AA else {
return false
}
return id == other.id
}
}
結(jié)果
a1 == a2
//結(jié)果:true,因?yàn)槲覀冏宨d相等成為其相等的條件
結(jié)論:
我們可以自由的定制兩個對象相等的條件,只要重寫
override func isEqual(_ object: Any?) -> Bool
重點(diǎn)來啦
class AA:NSObject {
let id:String
init(id:String) {
self.id = id
super.init();
}
override func isEqual(_ object: Any?) -> Bool {
guard let other = object as? AA else {
return false
}
return id == other.id
}
}
let a0 = AA(id: "1")
let a1 = AA(id: "2")
let a2 = AA(id: "2")
let a3 = AA(id: "4")
var a:Set<AA> = [a0,a1]
var b:Set<AA> = [a2,a3]
let c = a.subtracting(b)
結(jié)果為:
c:[a0,a1]
為什么,a1不能移除,因?yàn)閍1等于a2阿.
原因是,Set是用哈希表存的,哈希表里要找相同的對象,首先就要有相同的哈希值,再然后是isEqual.所以在AA里加override var hashValue: Int
class AA:NSObject {
let id:String
init(id:String) {
self.id = id
super.init();
}
override func isEqual(_ object: Any?) -> Bool {
guard let other = object as? AA else {
return false
}
return id == other.id
}
override var hashValue: Int{
return Int(id)!
}
}
let c = a.subtracting(b)
結(jié)果為:
c:[a0]