webentwicklung-frage-antwort-db.com.de

Wie bekomme ich den Schlüssel zu einem bestimmten Index aus einem Wörterbuch in Swift?

Ich habe eine Dictionary in Swift und möchte einen Schlüssel für einen bestimmten Index erhalten. 

var myDict : Dictionary<String,MyClass> = Dictionary<String,MyClass>()

Ich weiß, dass ich die Tasten durchlaufen und protokollieren kann 

for key in myDict.keys{

    NSLog("key = \(key)")

}

Seltsamerweise ist so etwas nicht möglich

var key : String = myDict.keys[0]

Warum ? 

90
the_critic

Das liegt daran, dass keysLazyMapCollection<[Key : Value], Key> zurückgibt, was mit einem Int nicht subskribiert werden kann. Eine Möglichkeit, dies zu erreichen, besteht darin, die Variable startIndex des Wörterbuchs um die ganze Zahl, die Sie subskribieren möchten, vorzustellen, zum Beispiel:

let intIndex = 1 // where intIndex < myDictionary.count
let index = myDictionary.startIndex.advancedBy(intIndex) // index 1
myDictionary.keys[index]

Eine andere mögliche Lösung wäre, ein Array mit keys als Eingabe zu initialisieren. Dann können Sie Ganzzahl-Subskripte für das Ergebnis verwenden:

let firstKey = Array(myDictionary.keys)[0] // or .first

Denken Sie daran, dass Wörterbücher von Natur aus ungeordnet sind. Erwarten Sie also nicht, dass der Schlüssel in einem bestimmten Index immer derselbe ist.

161
Mick MacCallum

Swift 3: Array() kann dabei hilfreich sein.

Schlüssel abrufen:  

let index = 5 // Int Value
Array(myDict)[index].key

Wert erhalten :  

Array(myDict)[index].value
36
roy

Hier ist eine kleine Erweiterung für den Zugriff auf Schlüssel und Werte im Wörterbuch nach Index:

extension Dictionary {
    subscript(i: Int) -> (key: Key, value: Value) {
        return self[index(startIndex, offsetBy: i)]
    }
}
22
bzz

Sie können über ein Wörterbuch iterieren und einen Index mit for-in und Aufzählung erstellen (wie andere bereits gesagt haben, es gibt keine Garantie dafür, dass der Befehl wie unten beschrieben angezeigt wird).

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

Wenn Sie zuerst sortieren wollen ..

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)]

dann iterieren.

for (index, entry) in enumerate(sortedKeysArray) {
    println(index)    // 0   1   2
    println(entry.0)  // a   c   d
    println(entry.1)  // 456 123 45
}

Wenn Sie ein geordnetes Wörterbuch erstellen möchten, sollten Sie unter Generics nachsehen.

10

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

Wenn Sie die Schlüssel oder Werte eines Wörterbuchs mit einer API verwenden müssen, die eine Array-Instanz verwendet, initialisieren Sie ein neues Array mit der Eigenschaft keys oder values:

let airportCodes = [String](airports.keys) // airportCodes is ["TYO", "LHR"]   
let airportNames = [String](airports.values) // airportNames is ["Tokyo", "London Heathrow"]
8
Jack

Swift 3. Beispiel für das erste Element

let wordByLanguage = ["English": 5, "Spanish": 4, "Polish": 3, "Arabic": 2]

if let firstLang = wordByLanguage.first?.key {
    print(firstLang)  // English
}
5

In Swift 3 Versuchen Sie diesen Code zu verwenden, um das Schlüsselwertpaar (Tuple) am angegebenen Index abzurufen: 

extension Dictionary {
    subscript(i:Int) -> (key:Key,value:Value) {
        get {
            return self[index(startIndex, offsetBy: i)];
        }
    }
}
4
Michał Ziobro

Hier ist ein Beispiel mit 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

Schnell 4


Etwas abseits des Themas: Aber hier ist, wenn Sie ein Array von Wörterbüchernd. H.: [[String: String]] haben

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

Ich habe so etwas wie eine LinkedHashMap in Java gesucht. Weder Swift noch Objective-C haben einen, wenn ich mich nicht irre.

Mein erster Gedanke war, mein Wörterbuch in ein Array einzuwickeln. [[String: UIImage]] aber dann merkte ich, dass es mit Array(dict)[index].key verrückt war, den Schlüssel aus dem Wörterbuch zu nehmen, also ging ich mit Tuples. Jetzt sieht mein Array aus wie [(String, UIImage)], so dass ich es per Tuple.0 abrufen kann. Nicht mehr in ein Array konvertieren. Nur meine 2 Cent.

0
newDeveloper