Diferencia entre el hash y el hashValue de Swift
swift-protocols (1)
El protocolo Hashable
en Swift requiere que implementes una propiedad llamada 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 }
}
Sin embargo, parece que también hay una propiedad similar llamada hash
.
¿Cuál es la diferencia entre hash
y hashValue
?
hash
es una propiedad requerida en el protocolo NSObject
, que agrupa los métodos que son fundamentales para todos los objetos de Objective-C, por lo que es anterior a Swift. La implementación predeterminada simplemente devuelve la dirección de los objetos, como se puede ver en NSObject.mm , pero se puede anular la propiedad en NSObject
subclases de NSObject
.
hashValue
es una propiedad requerida del protocolo Swift Hashable
.
Ambos están conectados a través de una extensión NSObject
definida en la biblioteca estándar de Swift en 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)
}
(Para conocer el significado de open var
, consulte ¿Qué es la palabra clave ''abrir'' en Swift?. )
De modo que NSObject
(y todas las subclases) se ajustan al protocolo Hashable
, y la implementación de hashValue
predeterminada devuelve la propiedad hash
del objeto.
Existe una relación similar entre el método NSObject
protocolo NSObject
y el operador ==
del protocolo Equatable
: NSObject
(y todas las subclases) se ajustan al protocolo Equatable
, y la implementación predeterminada ==
llama al método isEqual:
en los operandos.