web-dev-qa-db-fra.com

Comment puis-je obtenir la clé à un index spécifique d'un dictionnaire dans Swift?

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 ? 

90
the_critic

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.

161
Mick MacCallum

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
36
roy

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)]
    }
}
22
bzz

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.

10
Matthew Korporaal

De https://developer.Apple.com/library/prerelease/ios/documentation/Swift/conceptual/Swift_programming_language/CollectionTypes.html :

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

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
}
5
Vladimir Vozniak

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)];
        }
    }
}
4
Michał Ziobro

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
3
Sean Chen

Swift 4


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
1
Suhaib

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.

0
newDeveloper