Set 里面怎么判斷兩個object相等

平常,我們判斷兩個對象是否相等可以用==
示例:

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]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容