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



swift-protocols (1)

Протокол 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 .

В чем разница между hashValue и hashValue ?


hash является обязательным свойством в протоколе NSObject , который группирует методы, которые являются фундаментальными для всех объектов 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 см. В разделе Что такое ключевое слово open в Swift? ).

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

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





swift-protocols