Protocol

Hashable

A type that can be hashed into a Hasher to produce an integer hash value. Hasherへとハッシュ化されることで整数ハッシュ値を生成することが可能な型。

Declaration 宣言

protocol Hashable

Overview 概要

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. あなたはHashableプロトコルに準拠するあらゆる型を集合においてまたは辞書キーとして使うことができます。標準ライブラリの中の多くの型はHashableに準拠します:様々な文字列、整数、浮動小数点およびブール値、そして様々な集合さえも、初期状態でハッシュ可能です。いくつかの他の型、オプショナル、配列および範囲は、自動的にハッシュ可能になります、それらの型引数が同じものを実装する場合には。

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. あなた独自のあつらえの型も同様にハッシュ化されることができます。あなたが列挙を関連値なしで定義するとき、それはHashable準拠を自動的に手に入れます、そしてあなたはHashable準拠をあなたの他のあつらえの型に加えることが、hash(into:)メソッドを実装することによって行えます。それらの格納プロパティが全てHashableであるstructに対して、そして全てHashable関連値を持つenum型に対して、コンパイラはhash(into:)の実装を自動的に提供可能です。

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. ある値をハッシュ化することは、それの本質的な構成要素を、Hasher型によって表される、ハッシュ関数へと投入することを意味します。本質的な構成要素は、その型のもつEquatableの実装に寄与するそれらです。等しい2つのインスタンスは、同じ値をHasherへとhash(into:)において、同じ順序で与えなければなりません。

Conforming to the Hashable Protocol Hashableプロトコルに準拠する

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. あなた独自のあつらえの型を集合でまたは辞書のキー型として使うには、Hashable準拠をあなたの型に加えてください。Hashableプロトコルは、Equatableプロトコルから継承します、それであなたは同様にそのプロトコルのもつ要件も満たさなければなりません。

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: コンパイラは、自動的にあなたのあつらえの型のもつHashableと要件を、あなたがHashable準拠をその型の持つ元の宣言において宣言して、あなたの型がそれら基準に合う場合に合成します。

  • For a struct, all its stored properties must conform to Hashable. structに対して、すべてのそれの格納プロパティはHashableに準拠しなければなりません。

  • For an enum, all its associated values must conform to Hashable. (An enum without associated values has Hashable conformance even without the declaration.) enumに対して、すべてのそれの関連値はHashableに準拠しなければなりません。(関連値なしでのenumは、Hashable準拠をたとえ宣言なしでも持ちます。)

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. あなたの型のもつHashable準拠をカスタマイズするために、Hashableを上でリストされる基準に沿わない型において採用するために、または既存の型を拡張してHashableに準拠するためには、hash(into:)メソッドをあなたのあつらえの型において実装してください。

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. あなたのhash(into:)実装において、combine(_:)をその提供されたHasherインスタンス上で、あなたの型の本質的な構成要素とともに呼び出してください。あなたの型がHashableEquatableプロトコルの意味論的要件に沿うことを確実にするために、あなたの型のもつEquatable準拠が合致するように同様にカスタマイズすることは良い考えです。

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: 1つの例として、GridPoint型を考えてみてください、それはある格子状配列のボタンにおけるある場所を記述します。ここにGridPoint型の初期宣言があります:


/// 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. あなたは、ユーザがすでにタップしたところの格子点ひとそろいを作成したいでしょう。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)
    }
}

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. hash(into:)メソッドはこの例において、格子点のもつxyプロパティをその提供されたhasherへと与えます。これらプロパティは、==演算子関数において同等性についてテストするために使われるのと同じものです。

Now that GridPoint conforms to the Hashable protocol, you can create a set of previously tapped grid points. GridPointHashableプロトコルに準拠する今、あなたは以前にタップされた格子点の集合を作成することができます。


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

Topics 話題

Providing a Hash Value ハッシュ値の提供

Deprecated 非推奨

Relationships 関係

Inherits From 継承元

Conforming Types これらの型が準拠

See Also 参照

Sets and Dictionaries 集合と辞書