Set est une collection non ordonnée d'éléments uniques, réalisée sous forme de table de hachage. La principale différence avec Array est l'absence de valeurs en double et l'absence d'ordre. Les principales interfaces : méthodes d'insertion (insert), de suppression (remove), de vérification de l'existence (contains).
Temps d'exécution :
insert, remove et contains fonctionnent en moyenne en O(1).Exemple d'utilisation :
var numbers: Set<Int> = [1, 2, 3] numbers.insert(4) // Set : 1, 2, 3, 4 numbers.insert(2) // Set ne changera pas, 2 est déjà présent numbers.remove(1) // Set : 2, 3, 4 print(numbers.contains(3)) // true
Utilisez Set lorsque l'unicité est importante, mais que l'ordre ne l'est pas. Comparé à Array :
Array se font en O(n).Array, des valeurs identiques sont autorisées.Le Set supporte : ∪, ∩, −, ⊆, ⊇ et d'autres opérations de théorie des ensembles.
Question :
Le code suivant va-t-il se compiler et pourquoi ?
let set: Set = [[1, 2], [3, 4]]
Réponse :
Non, cela ne va pas. Set exige que le type des éléments respecte le protocole Hashable. Un tableau (Array) ne respecte pas Hashable, donc il n'est pas possible de créer des ensembles de tableaux directement. Par exemple, Set<Int> est correct, mais Set<[Int]> ne l'est pas.
Histoire
Dans un service, les développeurs stockaient des identifiants uniques d'objets sous forme de [Int], et non Set<Int>. Cela a causé des problèmes : les vérifications de présence et de suppression fonctionnaient lentement (temps — O(n)), des doublons apparaissaient, et la logique commerciale était compromise.
Histoire
Tentative de placer dans Set des types non standard (par exemple, création d'un Set<MyModel>), mais le type ne respectait pas Hashable. Le code ne se compilait qu'après l'ajout des protocoles correspondants, mais lors de l'implémentation d'erreurs dans hash(into:), des collisions et un comportement imprévisible s'accumulaient pendant l'exécution.
Histoire
Un développeur s'attendait à ce que l'ordre de traversée des éléments dans Set corresponde à l'ordre d'insertion, et a organisé l'UI dans le même ordre. Par conséquent, à chaque lancement, l'ordre était différent, ce qui entraînait un affichage incohérent des données pour l'utilisateur final.