swift hash swift-protocols

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.