Разница между хэшем Swift и hashValue

на Hashable протокол в Swift требует реализации свойства с именем 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?

1 ответов


hash является обязательным свойством в NSObject протокол, которые группируют методы, фундаментальные для всех объектов Objective-C, так что это предшествует Swift. Реализация по умолчанию просто возвращает адрес объектов , как можно видеть в NSObject.мм, но можно переопределить свойство в NSObject подклассы.

hashValue является обязательным свойством Swift Hashable протокол.

оба подключены через :

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 см. что такое ключевое слово "open" в Swift?.)

так NSObject (и все подклассы) соответствуют Hashable протокол и значение по умолчанию hashValue реализация верните hash свойства объекта.

аналогичная связь существует между isEqual метод NSObject протокол, а == оператор от Equatable протокол:NSObject (и все подклассы) соответствуют Equatable протокол и значение по умолчанию == реализация вызывает isEqual: метод операндов.