Hashable
Hasher
以產生整數散列值的類型。聲明
protocol Hashable : Equatable
概述
您可以在集合中使用任何符合Hashable
協議的類型或用作字典鍵。標準庫中的許多類型都符合Hashable
:字符串、整數、浮點和布爾值,甚至集合默認情況下都是可散列的。其他一些類型,例如可選項、數組和範圍,當它們的類型參數實現相同時,它們會自動變為可散列的。
您自己的自定義類型也可以是可散列的。當您定義一個沒有關聯值的枚舉時,它會自動獲得Hashable
一致性,並且您可以通過實現hash(into:)
方法將Hashable
一致性添加到您的其他自定義類型。對於存儲屬性全部為 Hashable
的結構,以及具有全部 - Hashable
關聯值的枚舉類型,編譯器能夠自動提供 hash(into:)
的實現。
散列一個值意味著將其基本組成部分輸入一個散列函數,由 Hasher
類型表示。基本組件是那些有助於 Equatable
的類型實現的組件。兩個相等的實例必須以相同的順序將相同的值提供給 hash(into:)
中的 Hasher
。
符合哈希協議
要在集合中使用您自己的自定義類型或作為字典的鍵類型,請將 Hashable
一致性添加到您的類型。 Hashable
協議繼承自 Equatable
協議,因此您還必須滿足該協議的要求。
當您在類型的原始聲明中聲明 Hashable
一致性並且您的類型滿足以下條件時,編譯器會自動綜合您的自定義類型的 Hashable
和要求:
-
對於
struct
,其所有存儲的屬性必須符合Hashable
。 -
對於
enum
,其所有關聯值必須符合Hashable
。 (即使沒有聲明,沒有關聯值的enum
也具有Hashable
一致性。)
要自定義類型的 Hashable
一致性,在不符合上述條件的類型中采用 Hashable
,或擴展現有類型以符合 Hashable
,請在自定義類型中實現 hash(into:)
方法.
在您的hash(into:)
實現中,使用您類型的基本組件在提供的Hasher
實例上調用combine(_:)
。為確保您的類型滿足 Hashable
和 Equatable
協議的語義要求,最好同時自定義類型的 Equatable
一致性以匹配。
例如,考慮一個說明按鈕網格中位置的GridPoint
類型。這是 GridPoint
類型的初始聲明:
/// A point in an x-y coordinate system.
struct GridPoint {
var x: Int
var y: Int
}
您想創建一組用戶已經點擊的網格點。因為 GridPoint
類型還不是可散列的,所以不能在集合中使用。要添加Hashable
一致性,請提供==
運算符函數並實現hash(into:)
方法。
extension GridPoint: Hashable {
static func == (lhs: GridPoint, rhs: GridPoint) -> Bool {
return lhs.x == rhs.x && lhs.y == rhs.y
}
func hash(into hasher: inout Hasher) {
hasher.combine(x)
hasher.combine(y)
}
}
此示例中的 hash(into:)
方法將網格點的 x
和 y
屬性饋送到提供的哈希器中。這些屬性與 ==
運算符函數中用於測試相等性的屬性相同。
現在 GridPoint
符合 Hashable
協議,您可以創建一組先前點擊的網格點。
var tappedPoints: Set = [GridPoint(x: 2, y: 3), GridPoint(x: 4, y: 1)]
let nextTap = GridPoint(x: 0, y: 1)
if tappedPoints.contains(nextTap) {
print("Already tapped at (\(nextTap.x), \(nextTap.y)).")
} else {
tappedPoints.insert(nextTap)
print("New tap detected at (\(nextTap.x), \(nextTap.y)).")
}
// Prints "New tap detected at (0, 1).")
可用版本
相關用法
- Swift Hasher用法及代碼示例
- Swift KeyValuePairs flatMap(_:)用法及代碼示例
- Swift String.UTF8View first用法及代碼示例
- Swift Result.Publisher zip(_:_:_:)用法及代碼示例
- Swift Optional.Publisher reduce(_:_:)用法及代碼示例
- Swift Int8 ~(_:)用法及代碼示例
- Swift SetAlgebra isStrictSubset(of:)用法及代碼示例
- Swift UInt +(_:)用法及代碼示例
- Swift Array enumerated()用法及代碼示例
- Swift FlattenSequence prefix(_:)用法及代碼示例
- Swift Slice endIndex用法及代碼示例
- Swift LazySequence split(maxSplits:omittingEmptySubsequences:whereSeparator:)用法及代碼示例
- Swift MutableCollection partition(by:)用法及代碼示例
- Swift ReversedCollection min(by:)用法及代碼示例
- Swift RandomNumberGenerator用法及代碼示例
- Swift Dictionary.Keys shuffled()用法及代碼示例
- Swift AnySequence elementsEqual(_:)用法及代碼示例
- Swift UInt &<<(_:_:)用法及代碼示例
- Swift Optional.Publisher tryDrop(while:)用法及代碼示例
- Swift DefaultIndices endIndex用法及代碼示例
- Swift Substring.UnicodeScalarView insert(contentsOf:at:)用法及代碼示例
- Swift LazyFilterSequence dropFirst(_:)用法及代碼示例
- Swift LazySequence suffix(from:)用法及代碼示例
- Swift ArraySlice starts(with:)用法及代碼示例
- Swift Int16.Words max()用法及代碼示例
注:本文由純淨天空篩選整理自apple.com大神的英文原創作品 Hashable。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。