Swift – A ordem de valores armazenados é alterada completamente no dictionary

Tentei exibir dados que estão no formato Dicionário. Abaixo, três tentativas estão lá. Primeira tentativa, a ordem de saída foi completamente alterada. Segunda tentativa, a ordem de saída é igual à input. Mas, na terceira tentativa, declarei variável como NSDictionary. Saída exata que recebi. Por que isso muda no dictionary? Por favor me guie. Eu procurei pela tag do Swift’s Dictionary. Mas eu não consegui descobrir.

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

OUTRA CONSULTA: Eu usei play ground para verificar. Minha captura de canvas está abaixo:

play_ground_screen_shot

Aqui, em NSDictionary, eu dei nome5 como primeiro, mas no lado direito nome2 está exibindo, em seguida, em println, ele está exibindo em ordem crescente. Porque isso está acontecendo??

play_ground_screen_shot_2

Aqui, no dictionary, eu dei nome5 como primeiro, mas no lado direito nome2 está exibindo, então, no println, ele está exibindo, como é feito na linha do dictionary. Porque isso está acontecendo??

Isto é devido à definição de Dicionários:

Dicionário

Um dictionary armazena associações entre chaves do mesmo tipo e valores do mesmo tipo em uma coleção sem ordenação definida.

Não ordem, eles podem sair de forma diferente do que foram colocados.
Isso é comparável ao NSSet.


Editar:

NSDictionary

Os dictionarys coletam pares de valor-chave. Em vez de simplesmente manter uma coleção ordenada ou não ordenada de objects, um NSDictionary armazena objects contra determinadas chaves, que podem então ser usadas para recuperação.

Também não há ordem, no entanto, há sorting na impressão para fins de debugging.

Você não pode classificar um dictionary, mas pode classificar suas chaves e percorrê-las da seguinte forma:

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

Nem o NSDictionary nem o Swift::Dictionary ordenam seu armazenamento. A diferença é que alguns objects NSDictionary classificam sua saída ao imprimir e Swift::Dictionary não.

Da documentação de -[NSDictionary description] :

Se cada chave no dictionary for um object NSString, as inputs serão listadas em ordem crescente por chave, caso contrário, a ordem em que as inputs são listadas é indefinida. Esta propriedade destina-se a produzir saída legível para propósitos de debugging, não para serializar dados.

Este é realmente um problema com dictionarys. No entanto, há uma biblioteca disponível para garantir que o pedido permaneça como você o inicializou.

O OrderedDictionary é uma implementação leve de uma estrutura de dados de dictionary ordenada no Swift.

A estrutura OrderedDictionary é uma coleção genérica imutável que combina os resources do Dictionary and Array da biblioteca padrão do Swift. Like Dictionary armazena pares de valores-chave e mapeia cada chave para um valor. Como Array, armazena os pares classificados e acessíveis por um índice inteiro baseado em zero.

Confira aqui: https://github.com/lukaskubanek/OrderedDictionary

A partir da linguagem de programação Swift :

Um dictionary armazena associações entre chaves do mesmo tipo e valores do mesmo tipo em uma coleção sem ordenação definida .

Basicamente, a ordem dos itens como vistos na saída é arbitrária, dependente da implementação interna da estrutura de dados e não deve ser invocada.