Diccionario ordenado en Swift

¿Hay alguna forma incorporada de crear un mapa ordenado en Swift 2? Las matrices [T] se ordenan según el orden en que se agregan los objetos, pero los diccionarios [K : V] no están ordenados.

Por ejemplo

 var myArray: [String] = [] myArray.append("val1") myArray.append("val2") myArray.append("val3") //will always print "val1, val2, val3" print(myArray) var myDictionary: [String : String] = [:] myDictionary["key1"] = "val1" myDictionary["key2"] = "val2" myDictionary["key3"] = "val3" //Will print "[key1: val1, key3: val3, key2: val2]" //instead of "[key1: val1, key2: val2, key3: val3]" print(myDictionary) 

¿Hay alguna forma integrada de crear una key : value ordenada key : value mapa de key : value que se ordena de la misma manera que una matriz, o tendré que crear mi propia clase?

Me gustaría evitar crear mi propia clase si es posible, porque lo que sea que incluya Swift probablemente sea más eficiente.

Puedes ordenarlos teniendo claves con tipo Int .

 var myDictionary: [Int: [String: String]]? 

o

 var myDictionary: [Int: (String, String)]? 

Recomiendo el primero ya que es un formato más común (JSON, por ejemplo).

Solo use una matriz de tuplas en su lugar. Ordena por lo que quieras Todo “incorporado”.

 var array = [(name: String, value: String)]() // add elements array.sort() { $0.name < $1.name } // or array.sort() { $0.0 < $1.0 } 

“Si necesita una colección ordenada de pares clave-valor y no necesita la búsqueda rápida de claves que proporciona Dictionary, consulte el tipo DictionaryLiteral para obtener una alternativa”. – https://developer.apple.com/reference/swift/dictionary

Como dice Matt, los diccionarios (y conjuntos) son colecciones desordenadas en Swift (y en Objective-C). Esto es por diseño.

Si lo desea, puede crear una matriz de teclas del diccionario y ordenarlas en el orden que desee, y luego usarlas para obtener elementos de su diccionario.

NSDictionary tiene un método allKeys que le proporciona todas las teclas de su diccionario en una matriz. Me parece recordar algo similar para los objetos de Swift Dictionary, pero no estoy seguro. Todavía estoy aprendiendo los matices de Swift.

EDITAR:

Para Swift Dictionaries es someDictionary.keys

si sus claves confirman a Comparable, puede crear un diccionario ordenado de su diccionario sin clasificar de la siguiente manera

 let sortedDictionary = unsortedDictionary.sorted() { $0.key > $1.key } 

Swift no incluye ninguna capacidad incorporada de diccionario ordenado, y hasta donde yo sé, Swift 2 tampoco

Entonces deberás crear el tuyo propio. Puede consultar estos tutoriales para obtener ayuda:

Sé que tengo 18 años para la fiesta, pero ¿estudiaste NSMutableOrderedSet?

https://developer.apple.com/reference/foundation/nsorderedset

Puede usar conjuntos ordenados como alternativa a las matrices cuando el orden de los elementos es importante y el rendimiento para probar si un objeto está contenido en el conjunto es una prueba: la prueba de pertenencia a una matriz es más lenta que la prueba de pertenencia a un conjunto.

  var orderedDictionary = [(key:String, value:String)]() 

Esto es lo que hice, bastante sencillo:

 let array = [ ["foo": "bar"], ["foo": "bar"], ["foo": "bar"], ["foo": "bar"], ["foo": "bar"], ["foo": "bar"] ] // usage for item in array { let key = item.keys.first! let value = item.values.first! print(key, value) } 

Las claves no son únicas, ya que no se trata de un Dictionary sino de una Array pero puede utilizar las teclas de matriz.

Como han dicho otros, no existe un soporte integrado para este tipo de estructura. Es posible que agreguen una implementación a la biblioteca estándar en algún momento, pero dado que es relativamente raro que sea la mejor solución en la mayoría de las aplicaciones, entonces no aguantaría la respiración.

Una alternativa es el proyecto OrderedDictionary . Como se adhiere a BidirectionalCollection , obtiene la mayoría de las mismas API que probablemente esté acostumbrado a usar con otros tipos de Collection , y parece que (en la actualidad) se mantiene razonablemente bien.

use Dictionary.enumerated ()

ejemplo:

 for (n, c) in "Swift".enumerated() { print("\(n): '\(c)'") } // Prints "0: 'S'" // Prints "1: 'w'" // Prints "2: 'i'" // Prints "3: 'f'" // Prints "4: 't'"