hash
- это обязательное свойство в NSObject
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?.)
So NSObject
(и все подклассы) соответствуют протоколу Hashable
, а реализация hashValue
по умолчанию возвращает hash
свойства объекта.
Аналогичная зависимость существует между isEqual
методом протокола NSObject
, и ==
оператором из Equatable
протокола: NSObject
(и всех подклассов) соответствовать протоколу Equatable
и реализацией по умолчанию ==
называет isEqual:
метод на операндах.
'hash' является свойством протокола' 'NSObject' '(https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/), сравните [подкласс NSObject in Swift: hash vs hashValue, isEqual vs ==] (http://stackoverflow.com/questions/33319959/nsobject-subclass-in-swift-hash-vs-hashvalue-isequal-vs). –