美文网首页我的SWIFT收集
swift - Equatable,Hashable,Compa

swift - Equatable,Hashable,Compa

作者: 离子来了 | 来源:发表于2016-05-22 08:22 被阅读1843次

    在java和Objective-C的世界里,都是重写终极父类里面(Object和NSObject)里面重写HashValue和isEqual来达到要求,这里就略过不谈了。
    (判断2个对象相等)遵循的原则

    1. 如果两个对象的hashValue不相等,则认为两个对象不相等。反之相等,则跳转到第2步
    2. 判断2个对象是否相等(Swift-Equatable协议,Java和OC isEuqal),如果相等,则认为2个对象相等,反之则认为不相等。

    总结:用hashValue作为查询条件,去HashTable中查找出符合条件的纪录(对象),再用<code>相等</code>条件去对比。
    优点:避免用<code>相等</code>一个一个的去全局遍历,提高效率

    相等(Equatable)

    在面向对象的世界里,总是有一个栈区引用指向堆区的一个对象,相等自然也变得复杂起来。

    • (==)默认是比较引用,实现Equatable协议后就是实现协议后的比较
    • (===)比较的是引用
    class Person: Equatable {
        var name        = ""
        var age         = 0
    }
    func ==(m1:Person,m2:Person) -> Bool{
        return m1.name == m2.name && m1.age == m2.age
    }
    
            let p1 = Person()
            p1.name = "liyang"
            p1.age  = 24
            
            let p2 = Person()
            p2.name = "liyang"
            p2.age  = 24
            
            print(p1 == p2)  //true
            print(p1 === p2) //false
    

    哈希值(Hashable)

    在计算机的世界里,哈希值用于快速定位和查找(用于Set里面的对象和Dictionary里面的作为key的对象,都需要实现(Hashable)协议)被哈希的对象。
    好像是:内部会维护一个HashTable的一个表(想象成数据库的表),表类似于键值对的形式存在,hashValue就作为键(类似于带有索引的一个没有唯一约束的一个字段,注:并非主键,因为一个hashValue可能对应多条记录(也就是多个对象)。再判断相等<code>用Equatable</code>)

    自身实现hashValue是一个很复杂的过程,自定义对象实现hashValue的时候可通过系统已经实现hashValue,来桥接实现

    eg:

    class Person: Hashable {
        var name        = ""
        var age         = 0
        var hashValue: Int{//hashValue的实现
            return self.name.hashValue ^ self.age.hashValue
        }
    }
    func ==(m1:Person,m2:Person) -> Bool{
        return m1.name == m2.name && m1.age == m2.age
    }
    

    比较(Comparable)

    只要实现Comparable协议就好

    class Person: Comparable {
        var name        = ""
        var age         = 0
        
    }
    func ==(m1:Person,m2:Person) -> Bool{
        return m1.name == m2.name && m1.age == m2.age
    }
    //具体逻辑就忽略不实现了,很简单,具体业务,具体实现
    func <= (m1:Person,m2:Person) -> Bool{
        return m1.name == m2.name && m1.age == m2.age
    }
    func < (m1:Person,m2:Person) -> Bool{
        return m1.name == m2.name && m1.age == m2.age
    }
    func >= (m1:Person,m2:Person) -> Bool{
        return m1.name == m2.name && m1.age == m2.age
    }
    func > (m1:Person,m2:Person) -> Bool{
        return m1.name == m2.name && m1.age == m2.age
    }
    

    附注(翻译自):

    哈希表(HashTable)的概念

    一般的线性表(想想成一般的数据库结构表就可以了)

    eg:假设对象有<code>前面是对象,括号里是对应的哈希值</code>:Obejct1(1),Obejct2(2),Obejct3(3),Obejct4(4),Obejct5(1)

    主键 哈希值 对应的对象
    1 1 Object1
    2 2 Object2
    3 3 Object3
    4 4 Object4
    5 1 Object5

    可从上面的哈希表中很清楚的看出Object1和Object5的哈希值是一样的

    当这5个对象在一个集合(Dictinary and Set)中的时候。

    假设<code>Set</code>中,再次往集合中放入Object1

    1. 取出Object1的哈希值
    2. 得到的哈希值在哈希表中进行检索,只有2条记录满足条件(1,5)
    3. 得到的2个对象,再用<code>相等协议</code>去比较相等

    总结:大大提高效率,避免了全部遍历的冗余。

    相关文章

      网友评论

        本文标题:swift - Equatable,Hashable,Compa

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