web-dev-qa-db-fra.com

Carte commandée en Swift

Existe-t-il un moyen intégré pour créer une carte ordonnée dans Swift 2? Arrays [T] sont triés selon l'ordre dans lequel les objets sont ajoutés, mais les dictionnaires [K : V] ne sont pas commandés.

Par exemple

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)

Existe-t-il des méthodes intégrées pour créer un key : value une carte ordonnée de la même manière qu'un tableau, ou devrai-je créer ma propre classe?

Je voudrais éviter autant que possible de créer ma propre classe, car ce qui est inclus par Swift serait probablement plus efficace.

46
Jojodmo

Vous pouvez les commander en ayant des clés de type Int.

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

ou

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

Je recommande le premier car c'est un format plus courant (JSON par exemple).

29
chrisamanse

Utilisez simplement un tableau de tuples à la place. Triez ce que vous voulez. Tous "intégrés".

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

"Si vous avez besoin d'une collection ordonnée de paires clé-valeur et que vous n'avez pas besoin de la recherche rapide de clé fournie par Dictionary, consultez le type DictionaryLiteral pour une alternative." - https://developer.Apple.com/reference/Swift/dictionary

22
coffeecoder

Comme Matt le dit, les dictionnaires (et les ensembles) sont des collections non ordonnées dans Swift (et en Objective-C). Ceci est voulu par la conception.

Si vous le souhaitez, vous pouvez créer un tableau des clés de votre dictionnaire et le trier dans l'ordre de votre choix, puis l'utiliser pour extraire des éléments de votre dictionnaire.

NSDictionary a une méthode allKeys qui vous donne toutes les clés de votre dictionnaire dans un tableau. Je semble me souvenir de quelque chose de similaire pour Swift objets du dictionnaire, mais je ne suis pas sûr. J'apprends toujours les nuances de Swift.

MODIFIER:

Pour Swift Dictionnaires c'est someDictionary.keys

7
Duncan C

Swift n'inclut aucune fonctionnalité intégrée de dictionnaire ordonné, et pour autant que je sache, Swift 2 non plus

Ensuite, vous créerez le vôtre. Vous pouvez consulter ces tutoriels pour obtenir de l'aide:

3
enes

si vos clés confirment la comparabilité, vous pouvez créer un dictionnaire trié à partir de votre dictionnaire non trié comme suit

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

Je sais que je suis à la fête mais avez-vous examiné NSMutableOrderedSet?

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

Vous pouvez utiliser des ensembles ordonnés comme alternative aux tableaux lorsque l'ordre des éléments est important et que le fait de vérifier si un objet est contenu dans l'ensemble est un élément à prendre en compte. Le test d'appartenance à un tableau est plus lent que le test d'appartenance à un ensemble.

1
AkademiksQc
    var orderedDictionary = [(key:String, value:String)]()
1
Jay Zi

Comme d'autres l'ont dit, il n'y a pas de support intégré pour ce type de structure. Il est possible qu'ils ajoutent une implémentation à la bibliothèque standard à un moment donné, mais étant donné que c'est relativement rare pour que ce soit la meilleure solution dans la plupart des applications, Je ne retiendrais pas ton souffle.

Une alternative est le projet OrderedDictionary . Comme il adhère à BidirectionalCollection, vous obtenez la plupart des mêmes API que celles que vous avez l'habitude d'utiliser avec d'autres types Collection, et il semble être (actuellement) raisonnablement bien géré.

0
PeejWeej