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 :
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.
Collection non ordonnée d'éléments uniques (Hashable). Accès par hachage — très rapide, les doublons ne sont pas autorisés.
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 :
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
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 :
Inconvénients :
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 :
Inconvénients :