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"]