ios swift nsdictionary

ios - Rápido: el orden de los valores almacenados se cambia por completo en el Diccionario



swift nsdictionary (6)

Del lenguaje de programació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 la salida es arbitrario, depende de la implementación interna de la estructura de datos y no se debe confiar en él.

Traté de mostrar datos que están en formato Diccionario. A continuación, hay tres intentos. Primer intento, el orden de salida se cambia por completo. Segundo intento, el orden de salida es el mismo que el de entrada. Pero, en el tercer intento, declaró la variable como NSDictionary. Salida exacta que recibí. ¿Por qué esto cambia en el diccionario? Amablemente guíame. Busqué la etiqueta del Diccionario Swift. Pero no pude averiguarlo.

//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 PREGUNTA: He usado el campo de juego para verificar. Mi captura de pantalla está abajo:

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

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


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 ligera 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. Al igual que Dictionary, almacena pares 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ébalo aquí: https://github.com/lukaskubanek/OrderedDictionary


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 manera diferente a como se pusieron.
Esto es comparable a NSSet.

Editar:

NSDictionary

Los diccionarios recopilan pares clave-valor. En lugar de simplemente mantener una colección ordenada o no ordenada de objetos, un NSDictionary almacena objetos en claves dadas, que luego pueden usarse para su recuperación.

Tampoco hay un orden, sin embargo, hay una clasificación en la impresión con fines de depuración.


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 del 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 fines de depuración, no para serializar datos.


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


Un poco tarde para la fiesta, pero si desea mantener el orden, use KeyValuePairs , la compensación aquí es que si usa KeyValuePairs pierde la capacidad de mantener elementos únicos en su lista

var user: KeyValuePairs<String, String> { return ["FirstName": "NSDumb", "Address": "some address value here", "Age":"30"] }

huellas dactilares

["FirstName": "NSDumb", "Address": "some address value", "Age": "30"]