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