Dictionary — un conteneur associatif en Swift qui stocke des paires « clé-valeur ». Les clés doivent implémenter les protocoles Hashable et Equatable pour garantir l'unicité et un temps d'accès constant aux éléments.
Caractéristiques :
Hashable et Equatable sont explicitement implémentés.Exemple :
struct EmployeeID: Hashable { let company: String let id: Int } var employees: [EmployeeID: String] = [ EmployeeID(company: "A", id: 1): "Alice", EmployeeID(company: "B", id: 2): "Bob" ] let empName = employees[EmployeeID(company: "A", id: 1)] // Alice
Un Dictionary peut-il accepter un type utilisateur comme clé qui n'implémente pas Hashable ?
— Incorrect. Si un type n'implémente pas Hashable, il ne peut pas être utilisé comme clé. Une tentative d'utilisation entraînera une erreur de compilation.
Exemple :
class Foo {} var dict: [Foo: Int] = [:] // Erreur : Foo n'implémente pas Hashable
Histoire
Dans un projet, nous stockions des clés Dictionary basées sur des structures avec des tableaux à l'intérieur. La structure ne respectait pas le protocole Hashable, ce qui faisait que le Dictionary ne fonctionnait pas. Solution : implémenter notre propre hashValue en tenant compte de tous les champs, y compris les tableaux.
Histoire
Nous avons utilisé des sous-classes NSObject comme clés, en nous appuyant sur l'adresse de l'objet. Après avoir réécrit une partie du code avec des structures, les données ne correspondaient plus : les valeurs de hachage des structures étaient calculées différemment, ce qui entraînait une perte d'accessibilité aux données.
Histoire
Lors du stockage d'un dictionnaire avec une clé complexe, nous avons oublié d'implémenter Equatable. Résultat : les éléments avec des paramètres identiques étaient considérés comme des clés différentes, des doublons apparaissaient et des erreurs survenaient lors de la recherche dans le dictionnaire.