web-dev-qa-db-fra.com

Différence entre le hachage de Swift et hashValue

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?

25
cfischer

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.

36
Martin R