iOS协议:可哈希

在上一篇文章中,我们讨论了相等和可比较的协议,我们将研究另一个更快的协议,即Hashable。

Hashable是一种协议,它提供了使用自定义类的对象作为Dictionary或set中的键的功能,按照APPLE定义的可哈希值:

 提供整数哈希值的类型。 

许多内置类型提供哈希值,或者我会说它们符合哈希协议,包括字符串,整数,浮点数和布尔值,甚至是集合。

注意: 当您定义一个没有关联值的枚举时,它会 自动 获得可 Hashable 一致性。

如果您使用Hashable协议使一个类符合并且该类的实例相等,即a == b,则a.hashvalue == b.hashvalue也将适用,但相反情况并非如此。

按照苹果:

哈希值不能保证在程序的不同执行中相等。 不要保存哈希值以供将来执行。

哈希协议是从等同协议继承而来的,因此您需要同时遵守这两个协议。

让我们借助示例来了解事物:-

我们将使用rollNumber创建一个名为“ Student”的快捷类。

现在我们需要添加可哈希的

弹出有关可哈希和等值一致性的错误。我们将重写“ ==”运算符以实现等值一致性,并提供hashValue,hashValue应该是计算属性,但在示例中作为实验,我们将其用作存储属性。

 班级学生:适用于{ 
var hashValue:Int = 0静态函数==(lhs:学生,rhs:学生)-> Bool {如果lhs.rollNumber == rhs.rollNumber {返回true}返回false} let rollNumber:Int init(rollnumber:Int = 0 ){self.rollNumber = rollnumber}}

现在,如果我们创建此Student类的实例并将其用作哈希值,则可以查看结果。

 让lovekesh:Student = Student(rollnumber:1)var studentInfo:Dictionary  =字典() 

在这里,我们创建了一个名为hashpValue值为0,rollnumber为1的Student实例“ Lovekesh”,并以Student为键声明了StudentInfo字典。

  studentInfo [lovekesh] =“第十标准” 
打印(studentInfo [lovekesh]!)

结果将是“第十标准”,请自己尝试,现在,如果我们更改hashValue并再次添加字符串该怎么办

  studentInfo [lovekesh] =“第十个标准” lovekesh.hashValue = 1studentInfo [lovekesh] =“第十二个标准”打印(studentInfo [lovekesh]!) 

现在将打印什么以及Dictionary将具有多少值。

字典将只有一个值,即12th Standard,因此即使我们更改hashValue也不会将两个值添加到特定实例。因此只有一个对应于一个键的值,并且它使用当前hashValue来检索对应于特定键的值实例。


在Swift 4.1中,编译器可以为值类型编写“ ==”和hashValue的实现。例如

  struct学生:可哈希{ 
let rollNumber:整数
}

只有此代码才能满足我们用于Hashable协议的目的。提供此功能是为了减少样板代码,因为每件好事都有一些代价,如果我们希望编译器自己合成自己的代码,则必须遵循apple定义的一些规则。

这里P可以是Hashable或equatable协议

对于枚举:

以下规则确定P的要求是否可以综合为一个enum

  • 编译器不会在没有任何情况的情况下不综合Penum要求,因为不可能创建此类的实例。
  • 当且仅当所有情况的所有关联值都符合P ,编译器才用一个或多个情况综合P对一个enum的要求。

对于结构:

以下规则确定P的要求是否可以为struct

  • 对于没有存储属性的struct ,编译器将琐碎地综合P的要求。 (如果用户选择加入,则没有存储属性的struct所有实例都可以视为相等并且散列为相同的值。)
  • 当且仅当其所有已存储属性的所有类型都符合P ,编译器才能合成P对具有一个或多个已存储属性的struct的要求。

这是所有相关信息的链接

感谢您的阅读,请继续阅读。 我们将提供更多协议说明。

Interesting Posts