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
と呼ばれる同様のプロパティもあるようです。
hash
とhashValue
の違いは何ですか?
hash
は NSObject
プロトコル の必須プロパティです。これは、すべての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:
メソッドを呼び出します。