当前位置: 首页>>编程示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。