ProgrammationDéveloppeur iOS Junior

Quels sont les types de collections en Swift, comment diffèrent-elles par leur implémentation interne et quand utiliser quelle collection ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

En Swift, il existe trois collections standard principales : Array, Set et Dictionary. Chacune d'elles implémente différentes interfaces, diffère par sa structure interne et est destinée à des tâches différentes.

Historique de la question :

Les collections en Swift sont conçues avec un accent sur la sécurité des types (type safety) et la performance, y compris la notion de value semantics et la copie par principe de Copy-on-Write pour les Arrays/Set/Dictionary.

Problème :

Souvent, un développeur débutant utilise uniquement Array là où il serait plus approprié d'utiliser Set ou Dictionary, ce qui entraîne un gaspillage de mémoire et une diminution de la vitesse d'accès/recherche. Il est donc important de comprendre les différences.

Solution :

Array

Collection ordonnée d'éléments, accès par index, des doublons sont possibles. Est généralement implémentée à l'aide d'un tampon dynamique.

Set

Collection non ordonnée d'éléments uniques (Hashable). Accès par hachage — très rapide, les doublons ne sont pas autorisés.

Dictionary

Collection de paires clé-valeur. La clé doit être Hashable. Accès à la valeur par la clé (via une table de hachage).

Exemple de code :

var arr: [Int] = [1, 2, 3, 4] var set: Set<Int> = [1, 2, 2, 3] var dict: [String: Int] = ["a": 1, "b": 2] // set == [1, 2, 3] — les doublons sont éliminés

Caractéristiques clés :

  • Array est efficace pour l'accès par index, maintient l'ordre, mais l'accès par valeur est linéaire
  • Set est rapide pour la recherche et la vérification de la présence d'un élément, ne conserve que des valeurs Hashable uniques
  • Dictionary est optimal pour la recherche par clé (Hashable), ne conserve pas l'ordre, mais recherche et modifie rapidement les valeurs

Questions pièges.

Peut-on utiliser des types non Hashable comme éléments d’un Set ou d’un Dictionary ?

Non. Pour être stocké dans un Set/Dictionary, un élément doit être Hashable (avoir un identifiant haché unique). Sinon, le compilateur ne permettra pas de créer la collection.

struct Point {} // Set<Point> déclenchera une erreur car Point n’est pas Hashable

L'ordre de stockage des éléments dans un Set est-il le même que lors de leur ajout ?

Non. Set ne garantit pas l'ordre — l'itération peut donner n'importe quel ordre. Si vous avez besoin d'ordre, utilisez Array.

Que se passe-t-il si on tente d'accéder à une clé inexistante dans un Dictionary ?

Dictionary renverra un Optional. Faites attention — tenter d'accéder à une clé inexistante renverra nil, et non pas une erreur.

let val = dict["not exist"] // val — nil

Erreurs types et anti-patterns

  • Utiliser Array pour rechercher une valeur unique (préférer Set)
  • Utiliser Dictionary pour stocker des valeurs sans avoir besoin de rechercher par clé
  • Tenter d'utiliser des types non Hashable comme clés ou valeurs

Exemple de la vie réelle

Cas négatif

Un développeur utilise Array pour une liste unique d'utilisateurs et recherche l'unicité via contains. Avec de grandes listes — beaucoup de temps pour les vérifications.

Avantages :

  • Simplicité de mise en œuvre

Inconvénients :

  • Complexité de recherche linéaire, stockage redondant des doublons, charge mémoire élevée

Cas positif

La même liste est implémentée comme Set. La vérification de la présence est instantanée, les valeurs uniques sont garanties.

Avantages :

  • Accès rapide, économie de mémoire, exclusion des doublons

Inconvénients :

  • Pas de garanties sur l'ordre des éléments