web-dev-qa-db-ja.com

SwiftのハッシュとhashValueの違い

Swift=)のHashableプロトコルでは、hashValueというプロパティを実装する必要があります。

protocol Hashable : Equatable {
    /// Returns the hash value.  The hash value is not guaranteed to be stable
    /// across different invocations of the same program.  Do not persist the hash
    /// value across program runs.
    ///
    /// The value of `hashValue` property must be consistent with the equality
    /// comparison: if two values compare equal, they must have equal hash
    /// values.
    var hashValue: Int { get }
}

ただし、hashと呼ばれる同様のプロパティもあるようです。

hashhashValueの違いは何ですか?

25
cfischer

hashNSObjectプロトコル の必須プロパティです。これは、すべてのObjective-Cオブジェクトに不可欠なメソッドをグループ化するため、Swiftより前のバージョンです。 NSObject.mm でわかるように、デフォルトの実装はオブジェクトのアドレスを返すだけですが、NSObjectサブクラスのプロパティをオーバーライドできます。

hashValueは、Swift Hashableプロトコルの必須プロパティです。

両方ともSwift標準ライブラリ ObjectiveC.Swift で定義されているNSObject拡張を介して接続されています。

extension NSObject : Equatable, Hashable {
  /// The hash value.
  ///
  /// **Axiom:** `x == y` implies `x.hashValue == y.hashValue`
  ///
  /// - Note: the hash value is not guaranteed to be stable across
  ///   different invocations of the same program.  Do not persist the
  ///   hash value across program runs.
  open var hashValue: Int {
    return hash
  }
}

public func == (lhs: NSObject, rhs: NSObject) -> Bool {
  return lhs.isEqual(rhs)
}

open varの意味については、 Swiftの 'open'キーワードとは を参照してください。)

したがって、NSObject(およびすべてのサブクラス)はHashableプロトコルに準拠し、デフォルトのhashValue実装はオブジェクトのhashプロパティを返します。

isEqualプロトコルのNSObjectメソッドと、Equatableプロトコルの==演算子の間にも、同様の関係があります:NSObject(およびすべてサブクラス)はEquatableプロトコルに準拠し、デフォルトの==実装はオペランドに対してisEqual:メソッドを呼び出します。

36
Martin R