ProtocolSwift5.9.0
Hashable
A type that can be hashed into a Hasher
to produce an integer hash value.
protocol Hashable : Equatable
You can use any type that conforms to the Hashable
protocol in a set or as a dictionary key. Many types in the standard library conform to Hashable
: Strings, integers, floating-point and Boolean values, and even sets are hashable by default. Some other types, such as optionals, arrays and ranges automatically become hashable when their type arguments implement the same.
Your own custom types can be hashable as well. When you define an enumeration without associated values, it gains Hashable
conformance automatically, and you can add Hashable
conformance to your other custom types by implementing the hash(into:)
method. For structs whose stored properties are all Hashable
, and for enum types that have all-Hashable
associated values, the compiler is able to provide an implementation of hash(into:)
automatically.
Hashing a value means feeding its essential components into a hash function, represented by the Hasher
type. Essential components are those that contribute to the type’s implementation of Equatable
. Two instances that are equal must feed the same values to Hasher
in hash(into:)
, in the same order.
Conforming to the Hashable Protocol
To use your own custom type in a set or as the key type of a dictionary, add Hashable
conformance to your type. The Hashable
protocol inherits from the Equatable
protocol, so you must also satisfy that protocol’s requirements.
The compiler automatically synthesizes your custom type’s Hashable
and requirements when you declare Hashable
conformance in the type’s original declaration and your type meets these criteria:
For a
struct
, all its stored properties must conform toHashable
.For an
enum
, all its associated values must conform toHashable
. (Anenum
without associated values hasHashable
conformance even without the declaration.)
To customize your type’s Hashable
conformance, to adopt Hashable
in a type that doesn’t meet the criteria listed above, or to extend an existing type to conform to Hashable
, implement the hash(into:)
method in your custom type.
In your hash(into:)
implementation, call combine(_:)
on the provided Hasher
instance with the essential components of your type. To ensure that your type meets the semantic requirements of the Hashable
and Equatable
protocols, it’s a good idea to also customize your type’s Equatable
conformance to match.
As an example, consider a GridPoint
type that describes a location in a grid of buttons. Here’s the initial declaration of the GridPoint
type:
/// A point in an x-y coordinate system.
struct GridPoint {
var x: Int
var y: Int
}
You’d like to create a set of the grid points where a user has already tapped. Because the GridPoint
type is not hashable yet, it can’t be used in a set. To add Hashable
conformance, provide an ==
operator function and implement the hash(into:)
method.
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)
}
}
The hash(into:)
method in this example feeds the grid point’s x
and y
properties into the provided hasher. These properties are the same ones used to test for equality in the ==
operator function.
Now that GridPoint
conforms to the Hashable
protocol, you can create a set of previously tapped grid points.
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).")
Supertypes
protocol Equatable
A type that can be compared for value equality.
Requirements
var hashValue: Int
The hash value.
func hash(into: inout Hasher
) Hashes the essential components of this value by feeding them into the given hasher.
Citizens in Swift
Subtypes
protocol BinaryFloatingPoint
A radix-2 (binary) floating-point type.
protocol BinaryInteger
An integer type with a binary representation.
protocol FixedWidthInteger
An integer type that uses a fixed size for every instance.
protocol FloatingPoint
A floating-point numeric type.
protocol InstantProtocol
protocol SIMD
A SIMD vector of a fixed number of elements.
protocol SignedInteger
An integer type that can represent both positive and negative values.
protocol StringProtocol
A type that can represent a string as a collection of characters.
protocol UnsignedInteger
An integer type that can represent only nonnegative values.
Available in Distributed
Subtypes
protocol DistributedActor
The such obtained actor system is then used to
resolve(id:using:)
the decodedID
.
Available in Foundation
Subtypes
protocol AttributedStringProtocol
protocol ReferenceConvertible
Decorates types which are backed by a Foundation reference type.
Extension in Atomics
Subtypes
protocol AtomicInteger
A type that supports atomic integer operations through a separate atomic storage representation.
Extension in Crypto
Subtypes
protocol Digest
A protocol defining requirements for digests
protocol MessageAuthenticationCode
A protocol defining requirements for Message Authentication Codes
Extension in RealModule
Subtypes
protocol Real
A type that models the real numbers.
Extension in SwiftSyntax
Subtypes
protocol SyntaxHashable
Protocol that provides a common Hashable implementation for all syntax nodes