LoginSignup
4
3

More than 5 years have passed since last update.

Hashable

Last updated at Posted at 2017-10-18

Hashableプロトコルのリファレンスの意訳です。

概要

この型は整数のハッシュ値を提供します。

Hashableプロトコルに準拠する型は辞書のキーや集合で使うことができます。標準ライブラリの多くの型はデフォルトでHashableです。独自の型もHashableにできます。

関連する値をもたない列挙型を定義すると自動的にHashableになります。
他の独自の型でもhashValueプロパティを加えることでHashableにできます。

ハッシュ値はhashValueプロパティによって決まり、比較の際、互いが等しいときにハッシュ値は等しくなります。つまり、aとbが同じであるとき、a.hashValue == b.hashValueです。しかし、逆は必ずしも真ではありません。等しいハッシュ値が必ずしも互いが等しいとは限りません。

重要な点

ハッシュ値は異なるプログラムの実行において等しい値を保証していません。
ハッシュ値を将来の実行にそなえて保存しないでください。

Hashableプロトコルに準拠する

集合で独自の型を使いたい場合や、辞書のキーとして使用する場合、hashValueを定義することでHashableへの準拠を追加してください。

HashableプロトコルはEquatableプロトコルを継承していますので、等号演算子('==')関数を追加する必要があります。

 例として、 GridPoint型というボタンのグリッドにおける場所を記述する型を考えてみましょう。
 
GridPoint型の最初の宣言は次のとおりです:

     // A point in an x-y coordinate system.
     struct GridPoint {
         var x: Int
         var y: Int
     }

ユーザーが今までタップしたグリッドの位置のセットを作りたいとします。
GridPointはまだHashableでないので集合のElementとしてはまだ使えません。
Hashableに準拠するためには'=='演算子関数と'hashValue'プロパティを加えます。

     extension GridPoint: Hashable {
         var hashValue: Int {
             return x.hashValue ^ y.hashValue
         }

         static func == (lhs: GridPoint, rhs: GridPoint) -> Bool {
             return lhs.x == rhs.x && lhs.y == rhs.y
         }
     }

この例での'hashValue'プロパティはグリッドのxとyのハッシュ値をビットごとのXOR演算子('^')を用いて結合しています。'^'演算子は2つの整数を1つの整数に結合する一つの方法です。

 - 注:集合と辞書のパフォーマンスはハッシュ値に依存します。ハッシュ値がそれらに関連する要素とキーの衝突を最小化します。

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).")
4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3