[英]What is the use of hashable protocol in swift4?
請快速解釋如何使用可哈希協議。 Apple將hashable定義為“一種為整數提供哈希值的類型。”好的,但是什么是哈希值?
為了使對象符合Hashable,我們需要提供一個hashValue屬性,該屬性將為每個實例返回唯一的一致編號。 Hashable協議繼承自Equatable,因此您可能還需要實現==函數。
注意:如果兩個對象使用==比較相等,則它們也應生成相同的哈希值,但事實並非如此-可能會發生哈希沖突。
在Swift 4.1之前,遵循Hashable的操作很復雜,因為您需要手動計算hashValue屬性。 在Swift 4.1中,此功能得到了改進,因此,如果所有屬性都符合Hashable,則可以代表您合成hashValue。 Swift 4.2引入了新的Hasher結構,該結構提供了隨機種子的通用哈希函數,使我們的生活更輕松。 參考更多
hashValue
,如果對象符合可hashable
協議,則它必須具有hashValue
。 hashValue
可用於比較對象/唯一標識對象。
您可以通過兩種方式比較對象:
===
功能。 這將檢查對象引用(只能與類一起使用)。 它檢查左側對象是否與右側對象具有相同的引用。 即使兩個對象都具有完全相同的屬性值,但它們確實具有不同的引用,它也會返回false。
==
功能( Equatable
協議)。 它根據靜態func ==
檢查對象是否彼此相等。 您可以返回對象的hashValue
。 這樣,您可以說對象是基於屬性而不是引用相等的。
如果提供自己的hashValue
,則可以說對象彼此相等,而無論引用對象是什么。 您可以在Set
中使用符合可哈希協議的對象,因為Set
會基於hashValue
檢查對象是否彼此相等。
快速回答:
我們使用哈希整數到對象中,從而能夠通過將對象實例置於要查找的索引的前面來快速標識相等的對象。
沒有快速回答:
當您處理列表以查找對象時,您需要遍歷所有數組並比較屬性以查找所需的對象,這會隨着列表變大而使您的應用變慢。
使用SET時,內部機制使用哈希索引來查找對象,因此僅需花費時間即可計算出要查找的索引,然后就可以直接訪問您的對象 ,這太酷了。 為了使用SET,自Swift 4.1起,該對象需要符合Hashable協議,如果您的類或結構以及所有屬性均符合Hashable,則將在后台自動為您實現與Hashable和Equatable協議的符合性。 如果您不滿足這些要求,則必須確保您符合Equatable和Hashable協議。
等同協議需要覆蓋static func ==(..) ,以便比較您的對象。
哈希協議需要盡可能地提供唯一的整數值hashValue ,當兩個對象相等時,它們必須在兩個對象中相同。 希望這個幫助
Hashable文檔給出了一個具體的示例:
您可以在集合中或字典字典中使用任何符合Hashable協議的類型。
您可以將哈希值視為相等的快速近似。 兩個相等的元素將具有相同的哈希值,但不能保證兩個具有相同哈希值的元素實際上是相等的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.