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