ProgrammationDéveloppeur iOS

Parlez-nous du type de données Set en Swift : ses caractéristiques, interfaces, temps d'exécution des opérations et écueils potentiels à l'utilisation, différences avec le tableau (Array).

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

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 :

  • Les opérations insert, remove et contains fonctionnent en moyenne en O(1).
  • Traverser tous les éléments — O(n).

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 :

  • La suppression et la recherche d'un élément dans Array se font en O(n).
  • Dans Array, des valeurs identiques sont autorisées.

Le Set supporte : ∪, ∩, −, ⊆, ⊇ et d'autres opérations de théorie des ensembles.

Question piège

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.

Exemples d'erreurs réelles dues à la méconnaissance des subtilités du sujet


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.