swift - Equatable,Hashable,Comparable

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

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

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

相等(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可能对应多条记录(也就是多个对象)。再判断相等用Equatable

自身实现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:假设对象有前面是对象,括号里是对应的哈希值: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)中的时候。

假设Set中,再次往集合中放入Object1

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

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

你可能感兴趣的:(swift - Equatable,Hashable,Comparable)