當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


Swift Hashable用法及代碼示例

協議

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(_:)。為確保您的類型滿足 HashableEquatable 協議的語義要求,最好同時自定義類型的 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:) 方法將網格點的 xy 屬性饋送到提供的哈希器中。這些屬性與 == 運算符函數中用於測試相等性的屬性相同。

現在 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).")

可用版本

iOS 8.0+, iPadOS 8.0+, macOS 10.10+, Mac Catalyst 13.0+, tvOS 9.0+, watchOS 2.0+

相關用法


注:本文由純淨天空篩選整理自apple.com大神的英文原創作品 Hashable。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。