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
:
- 编译器不会在没有任何情况的情况下不综合
P
的enum
要求,因为不可能创建此类的实例。 - 当且仅当所有情况的所有关联值都符合
P
,编译器才用一个或多个情况综合P
对一个enum
的要求。
对于结构:
以下规则确定P
的要求是否可以为struct
:
- 对于没有存储属性的
struct
,编译器将琐碎地综合P
的要求。 (如果用户选择加入,则没有存储属性的struct
所有实例都可以视为相等并且散列为相同的值。) - 当且仅当其所有已存储属性的所有类型都符合
P
,编译器才能合成P
对具有一个或多个已存储属性的struct
的要求。
这是所有相关信息的链接
感谢您的阅读,请继续阅读。 我们将提供更多协议说明。