Разница между хэшем 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:
метод операндов.