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:
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 ??
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 ??
C'est à cause de la définition de dictionnaires:
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:
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.
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)" )
}
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
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.
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é.