美文网首页
Set 里面怎么判断两个object相等

Set 里面怎么判断两个object相等

作者: 轻云绿原 | 来源:发表于2017-07-17 16:31 被阅读208次

    平常,我们判断两个对象是否相等可以用==
    示例:

    class AA:NSObject {
        let id:String
        init(id:String) {
            self.id = id
            super.init();
        }
    }
    
    
    let a1 = AA(id: "2")
    let a2 = AA(id: "2")
    
    结果:
    a1 == a2 
    //结果:false,因为本来就是两个对象
    

    这里重写

    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
        }
    }
    
    结果
    a1 == a2 
    //结果:true,因为我们让id相等成为其相等的条件
    

    结论:

    我们可以自由的定制两个对象相等的条件,只要重写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
        }
    }
    
    
    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)
    
    
    结果为:
    c:[a0,a1]
    

    为什么,a1不能移除,因为a1等于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)
    

    结果为:

    c:[a0]
    

    相关文章

      网友评论

          本文标题:Set 里面怎么判断两个object相等

          本文链接:https://www.haomeiwen.com/subject/pnxqkxtx.html