Swift – El orden de los valores almacenados se cambia por completo en el Diccionario

Traté de mostrar los datos que están en formato de diccionario. A continuación, tres bashs están ahí. Primer bash, el orden de salida ha cambiado por completo. Segundo bash, el orden de salida es el mismo que el de entrada. Pero, en el tercer bash, declare variable como NSDictionary. Salida exacta que recibí. ¿Por qué esto cambia en el Diccionario? Amablemente guíame Busqué la etiqueta Swift’s Dictionary. Pero no pude descubrirlo.

//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; } 

OTRA CONSULTA: He utilizado el campo de juego para verificar. Mi captura de pantalla es a continuación:

play_ground_screen_shot

Aquí, en NSDictionary, di nombre 5 como el primero, pero en el lado derecho se muestra name2, luego, en println, se muestra en orden ascendente. ¿Por qué está pasando esto?

play_ground_screen_shot_2

Aquí, en Diccionario, di nombre 5 como el primero, pero en el lado derecho se muestra name2, luego, en println, se muestra cómo se toma en la línea del diccionario. ¿Por qué está pasando esto?

Esto se debe a la definición de Diccionarios:

Diccionario

Un diccionario almacena asociaciones entre claves del mismo tipo y valores del mismo tipo en una colección sin un orden definido.

No hay orden, pueden salir de forma diferente de lo que fueron puestos.
Esto es comparable a NSSet.


Editar:

NSDictionary

Diccionarios recogen pares clave-valor. En lugar de simplemente mantener una colección ordenada o no ordenada de objetos, un NSDictionary almacena objetos contra claves determinadas, que luego pueden usarse para la recuperación.

Tampoco hay un pedido, sin embargo, existe una ordenación en la impresión para fines de depuración.

No puede ordenar un diccionario, pero puede ordenar sus claves y recorrerlas de la siguiente manera:

 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)" ) } 

Ni NSDictionary ni Swift::Dictionary ordenan su almacenamiento. La diferencia es que algunos objetos NSDictionary clasifican su salida al imprimir y Swift::Dictionary no.

De la documentación de -[NSDictionary description] :

Si cada clave en el diccionario es un objeto NSString, las entradas se enumeran en orden ascendente por clave; de ​​lo contrario, el orden en que se enumeran las entradas no está definido. Esta propiedad está destinada a producir resultados legibles para depuración, no para serializar datos.

Este es realmente un problema con los diccionarios. Sin embargo, hay una biblioteca disponible para asegurarse de que el pedido se mantenga como lo inicializó.

OrderedDictionary es una implementación liviana de una estructura de datos de diccionario ordenada en Swift.

La estructura OrderedDictionary es una colección genérica inmutable que combina las características de Dictionary y Array de la biblioteca estándar de Swift. Como Dictionary, almacena parejas clave-valor y asigna cada clave a un valor. Al igual que Array, almacena esos pares ordenados y accesibles por un índice entero basado en cero.

Compruébelo aquí: https://github.com/lukaskubanek/OrderedDictionary

Del lenguaje de progtwigción Swift :

Un diccionario almacena asociaciones entre claves del mismo tipo y valores del mismo tipo en una colección sin un orden definido .

Básicamente, el orden de los elementos como se ve en el resultado es arbitrario, depende de la implementación interna de la estructura de datos y no se debe confiar en ellos.