Le protocole Hashable
dans Swift vous oblige à implémenter une propriété appelée 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 }
}
Cependant, il semble qu'il existe également une propriété similaire appelée hash
.
Quelle est la différence entre hash
et hashValue
?
hash
est une propriété obligatoire dans le protocole NSObject
, qui regroupe les méthodes qui sont fondamentales pour tous les objets Objective-C, et qui sont antérieures à Swift. L'implémentation par défaut renvoie simplement l'adresse des objets, comme on peut le voir dans NSObject.mm , mais on peut remplacer la propriété dans les sous-classes NSObject
.
hashValue
est une propriété obligatoire du protocole Swift Hashable
.
Les deux sont connectés via une extension NSObject
définie dans la bibliothèque standard Swift dans 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)
}
(Pour la signification de open var
, voir Quel est le mot-clé 'open' dans Swift? .)
Ainsi, NSObject
(et toutes les sous-classes) sont conformes au protocole Hashable
, et l'implémentation par défaut hashValue
renvoie la propriété hash
de l'objet.
Une relation similaire existe entre la méthode isEqual
du protocole NSObject
et le ==
opérateur du protocole Equatable
: NSObject
(et toutes les sous-classes) sont conformes au protocole Equatable
, et au paramètre par défaut ==
l'implémentation appelle le isEqual:
méthode sur les opérandes.