Mam Dictionary
w Swift i chciałbym uzyskać klucz o określonym indeksie.
var myDict : Dictionary<String,MyClass> = Dictionary<String,MyClass>()
Wiem, że mogę iterować klucze i rejestrować je
for key in myDict.keys{
NSLog("key = \(key)")
}
Jednak, o dziwo, coś takiego nie jest możliwe
var key : String = myDict.keys[0]
Czemu ?
ios
dictionary
swift
the_critic
źródło
źródło
Odpowiedzi:
Dzieje się tak, ponieważ
keys
zwracaLazyMapCollection<[Key : Value], Key>
, których nie można indeksować za pomocąInt
. Jednym ze sposobów rozwiązania tego problemu jest przesunięcie słownikastartIndex
o liczbę całkowitą, którą chciałeś indeksować, na przykład:Innym możliwym rozwiązaniem byłoby zainicjowanie tablicy z
keys
danymi wejściowymi, a następnie można użyć indeksów całkowitych na wyniku:Pamiętaj, że słowniki są z natury nieuporządkowane, więc nie oczekuj, że klucz w danym indeksie będzie zawsze taki sam.
źródło
Array(myDict)[0].0
ponieważ nie kopiowałoby tablicy kluczy i nie powinno kopiować wewnętrznych struktur słownika, chociaż może.myDict[keysArray[0]]
.'NSDictionary' is not convertible to '_ArrayBuffer<T>'
Swift 3:
Array()
może być do tego przydatny.Weź klucz :
Uzyskaj wartość:
źródło
["a": 1, "b": 2]
, można przekształcić w tablicę słowników, takich jak[[key: "a", value: 1], [key: "b", value: 2]]
, do tego można uzyskać dostęp za pomocą indeksu.Oto małe rozszerzenie dostępu do kluczy i wartości w słowniku według indeksu:
źródło
Możesz iterować słownik i pobrać indeks z for-in i wyliczyć (jak powiedzieli inni, nie ma gwarancji, że wyjdzie w kolejności jak poniżej)
Jeśli chcesz najpierw posortować ...
następnie iteruj.
Jeśli chcesz stworzyć uporządkowany słownik, powinieneś zajrzeć do Generics.
źródło
dict.enumerated().forEach { (index, element) in ... }
Od https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/CollectionTypes.html :
Jeśli musisz użyć kluczy lub wartości słownika z interfejsem API, który przyjmuje instancję Array, zainicjuj nową tablicę z właściwością keys lub values:
źródło
SWIFT 3. Przykład dla pierwszego elementu
źródło
W Swift 3 spróbuj użyć tego kodu, aby uzyskać parę klucz-wartość (krotkę) o podanym indeksie:
źródło
Oto przykład wykorzystujący Swift 1.2
źródło
SWIFT 4
Nieco nie na temat: ale tutaj jest, jeśli masz tablicę słowników, tj .: [[String: String]]
źródło
Szukałem czegoś w rodzaju LinkedHashMap w Javie. Ani Swift, ani Objective-C nie mają takiego, jeśli się nie mylę.
Moją początkową myślą było zawinięcie mojego słownika w tablicę.
[[String: UIImage]]
ale potem zdałem sobie sprawę, że wyrywanie klucza ze słownika było szalone,Array(dict)[index].key
więc poszedłem z krotkami. Teraz moja tablica wygląda[(String, UIImage)]
tak, że mogę ją pobrać przeztuple.0
. Koniec z konwertowaniem go na tablicę. Tylko moje 2 centy.źródło