Ответ 1
hash
является обязательным свойством в протоколе NSObject
, который группирует методы, которые являются фундаментальными для всех объектов Objective-C, поэтому что предшествует Свифту.
Реализация по умолчанию возвращает адрес объектов,
как видно из
NSObject.mm, но можно переопределить свойство
в подклассах NSObject
.
hashValue
является обязательным свойством протокола Swift Hashable
.
Оба подключаются через расширение NSObject
, определенное в
Быстрая стандартная библиотека в
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?.
So NSObject
(и все подклассы) соответствуют Hashable
протокол и стандартная реализация hashValue
верните свойство hash
объекта.
Аналогичное соотношение существует между методом isEqual
NSObject
, а оператор ==
из Equatable
протокол: NSObject
(и все подклассы) соответствуют Equatable
протокол и стандартная реализация ==
вызывает метод isEqual:
в операндах.