J'ai une Dictionary
dans Swift et je voudrais obtenir une clé à un index spécifique.
var myDict : Dictionary<String,MyClass> = Dictionary<String,MyClass>()
Je sais que je peux parcourir les clés et les enregistrer
for key in myDict.keys{
NSLog("key = \(key)")
}
Cependant, chose étrange, ce n'est pas possible
var key : String = myDict.keys[0]
Pourquoi ?
En effet, keys
renvoie LazyMapCollection<[Key : Value], Key>
, qui ne peut pas être indexé avec un int. Une façon de gérer cela consiste à faire avancer la variable startIndex
du dictionnaire, de l'entier que vous avez voulu souscrire, par exemple:
let intIndex = 1 // where intIndex < myDictionary.count
let index = myDictionary.startIndex.advancedBy(intIndex) // index 1
myDictionary.keys[index]
Une autre solution possible serait d'initialiser un tableau avec keys
en entrée, vous pouvez alors utiliser des indices entiers sur le résultat:
let firstKey = Array(myDictionary.keys)[0] // or .first
N'oubliez pas que les dictionnaires ne sont pas ordonnés par nature. Par conséquent, n'espérez pas que la clé d'un index donné soit toujours la même.
Swift 3: Array()
peut être utile pour cela.
Obtenir la clé :
let index = 5 // Int Value
Array(myDict)[index].key
Obtenir de la valeur:
Array(myDict)[index].value
Voici une petite extension pour accéder aux clés et aux valeurs du dictionnaire par index:
extension Dictionary {
subscript(i: Int) -> (key: Key, value: Value) {
return self[index(startIndex, offsetBy: i)]
}
}
Vous pouvez parcourir un dictionnaire et saisir un index avec for-in et énumérer (comme d'autres l'ont déjà dit, rien ne garantit qu'il sortira comme ci-dessous)
let dict = ["c": 123, "d": 045, "a": 456]
for (index, entry) in enumerate(dict) {
println(index) // 0 1 2
println(entry) // (d, 45) (c, 123) (a, 456)
}
Si vous voulez trier d'abord ..
var sortedKeysArray = sorted(dict) { $0.0 < $1.0 }
println(sortedKeysArray) // [(a, 456), (c, 123), (d, 45)]
var sortedValuesArray = sorted(dict) { $0.1 < $1.1 }
println(sortedValuesArray) // [(d, 45), (c, 123), (a, 456)]
puis itérer.
for (index, entry) in enumerate(sortedKeysArray) {
println(index) // 0 1 2
println(entry.0) // a c d
println(entry.1) // 456 123 45
}
Si vous voulez créer un dictionnaire commandé, vous devriez vous pencher sur les génériques.
Si vous devez utiliser les clés ou les valeurs d’un dictionnaire avec une API prenant une instance Array, initialisez un nouveau tableau avec la propriété keys ou values:
let airportCodes = [String](airports.keys) // airportCodes is ["TYO", "LHR"]
let airportNames = [String](airports.values) // airportNames is ["Tokyo", "London Heathrow"]
Swift 3. Exemple pour le premier élément
let wordByLanguage = ["English": 5, "Spanish": 4, "Polish": 3, "Arabic": 2]
if let firstLang = wordByLanguage.first?.key {
print(firstLang) // English
}
Dans Swift 3 essayez d'utiliser ce code pour obtenir une paire clé-valeur (Tuple) à un index donné:
extension Dictionary {
subscript(i:Int) -> (key:Key,value:Value) {
get {
return self[index(startIndex, offsetBy: i)];
}
}
}
Voici un exemple, en utilisant Swift 1.2
var person = ["name":"Sean", "gender":"male"]
person.keys.array[1] // "gender", get a dictionary key at specific index
person.values.array[1] // "male", get a dictionary value at specific index
Légèrement hors sujet: _ _ Mais si vous avez un {tableau de dictionnaires} _ i.e: [[String: String]]
var array_has_dictionary = [ // Start of array
// Dictionary 1
[
"name" : "xxxx",
"age" : "xxxx",
"last_name":"xxx"
],
// Dictionary 2
[
"name" : "yyy",
"age" : "yyy",
"last_name":"yyy"
],
] // end of array
cell.textLabel?.text = Array(array_has_dictionary[1])[1].key
// Output: age -> yyy
Je cherchais quelque chose comme un LinkedHashMap en Java. Ni Swift ni Objective-C n'en ont un si je ne me trompe pas.
Ma pensée initiale était d’envelopper mon dictionnaire dans un tableau. [[String: UIImage]]
mais je me suis rendu compte ensuite que saisir la clé du dictionnaire était délirant avec Array(dict)[index].key
alors je suis allé avec Tuples. Maintenant, mon tableau ressemble à [(String, UIImage)]
afin que je puisse le récupérer par Tuple.0
. Plus besoin de le convertir en tableau. Juste mes 2 cents.