Swift的hash和hashValue之间的区别

时间:2016-08-14 21:15:14

标签: swift hash swift-protocols

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之间的区别是什么?

1 个答案:

答案 0 :(得分:34)

hashNSObject protocol中的必需属性,它对所有Objective-C对象的基本方法进行分组,因此早于Swift。 默认实现只返回对象地址, 正如人们所看到的那样 NSObject.mm,但可以覆盖该属性 在NSObject子类中。

hashValue是Swift Hashable协议的必需属性。

两者都通过中定义的NSObject扩展名进行连接 Swift标准库 ObjectiveC.swift

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的含义,请参阅What is the 'open' keyword in Swift?。)

所以NSObject(和所有子类)符合Hashable 协议和默认的hashValue实现 返回对象的hash属性。

isEqual方法之间存在类似的关系 NSObject协议以及==中的Equatable运算符 协议:NSObject(和所有子类)符合Equatable 协议和默认的==实现 在操作数上调用isEqual:方法。