web-dev-qa-db-fra.com

Swift - L'ordre des valeurs stockées est complètement modifié dans le dictionnaire

J'ai essayé d'afficher des données au format Dictionnaire. Ci-dessous, trois tentatives sont là. Première tentative, l'ordre de sortie est complètement modifié. Deuxième tentative, l'ordre de sortie est identique à celui de l'entrée. Mais, dans la troisième tentative, j'ai déclaré variable en tant que NSDictionary. Sortie exacte que j'ai reçu. Pourquoi cela change-t-il dans le dictionnaire? Veuillez me guider. J'ai cherché l'étiquette du dictionnaire de Swift. Mais je n'ai pas pu le découvrir.

//First Attempt
var dict : Dictionary = ["name1" : "Loy", "name2" : "Roy"]
        println(dict)

//output:
[name2: Roy, name1: Loy]

//Second Attempt
var dict : Dictionary = ["name2" : "Loy", "name1" : "Roy"]
        println(dict)

//output:
[name2: Loy, name1: Roy]
-----------------------------------------------------------

//Third Attempt With NSDictionary
var dict : NSDictionary = ["name1" : "Loy", "name2" : "Roy"]
            println(dict)

//output:
{
    name1 = Loy;
    name2 = Roy;
}

Une autre question: J'ai utilisé un terrain de jeu pour vérifier. Ma capture d'écran est ci-dessous:

play_ground_screen_shot

Ici, dans NSDictionary, j’ai d’abord donné name5, mais name2 l’affiche à droite, puis, dans println, l’affichage est en ordre croissant. Pourquoi cela se passe-t-il ??

play_ground_screen_shot_2

Ici, dans Dictionary, j'ai donné name5 en premier, mais dans la partie droite, name2 s'affiche, puis, dans println, il indique comment il est pris sur la ligne Dictionary. Pourquoi cela se passe-t-il ??

16
McDonal_11

C'est à cause de la définition de dictionnaires:

Dictionnaire

Un dictionnaire stocke les associations entre des clés du même type et des valeurs du même type dans une collection sans ordre défini.

Il y a non ordre, ils pourraient sortir différemment de ce qu'ils ont été mis en. 
Ceci est comparable à NSSet.


Modifier:

NSDictionary

Les dictionnaires rassemblent les paires clé-valeur. Plutôt que de simplement gérer une collection d'objets ordonnée ou non, un NSDictionary stocke les objets contre des clés données, qui peuvent ensuite être utilisées pour la récupération.

Il y a aussi no order, mais le tri est imprimé à des fins de débogage.

12
Schemetrical

Vous ne pouvez pas trier un dictionnaire mais vous pouvez trier ses clés et les parcourir comme suit:

let myDictionary = ["name1" : "Loy", "name2" : "Roy", "name3" : "Tim", "name4" : "Steve"]   // ["name1": "Loy", "name2": "Roy", "name3": "Tim", "name4": "Steve"]


let sorted = myDictionary.sorted {$0.key < $1.key}  // or {$0.value < $1.value} to sort using the dictionary values
print(sorted) // "[(key: "name1", value: "Loy"), (key: "name2", value: "Roy"), (key: "name3", value: "Tim"), (key: "name4", value: "Steve")]\n"
for element in sorted {
    print("Key = \(element.key) Value = \(element.value)" )
}
9
Leo Dabus

C'est en effet un problème avec les dictionnaires. Cependant, une bibliothèque est disponible pour vous assurer que l'ordre reste tel que vous l'avez initialisé. 

OrderedDictionary est une implémentation légère d'une structure de données de dictionnaire ordonnée dans Swift.

La structure OrderedDictionary est une collection générique immuable qui combine les fonctionnalités de Dictionary et Array de la bibliothèque standard Swift. Comme Dictionary, il stocke les paires clé-valeur et mappe chaque clé à une valeur. Comme Array, il stocke les paires triées et accessibles par un index entier de base zéro.

Découvrez-le ici: https://github.com/lukaskubanek/OrderedDictionary

1
Antoine

Ni NSDictionary ni Swift::Dictionary ne commandent son stockage. La différence est que certains objets NSDictionary trient leur sortie lors de l'impression et que Swift::Dictionary ne le fait pas.

De la documentation de -[NSDictionary description]:

Si chaque clé du dictionnaire est un objet NSString, les entrées sont par ordre croissant par clé, sinon l'ordre dans lequel le les entrées sont répertoriées est indéfinie. Cette propriété est destinée à produire sortie lisible à des fins de débogage, pas pour la sérialisation des données.

1
Greg Parker

De Le langage de programmation Swift :

Un dictionnaire stocke les associations entre des clés du même type et des valeurs du même type dans une collection avec no ordering.

Fondamentalement, l'ordre des éléments tel qu'il apparaît dans la sortie est arbitraire, dépend de la mise en œuvre interne de la structure de données et ne doit pas être utilisé.

0
Jakub Vano