Как получить ключ по определенному индексу из словаря в Swift?
У меня есть Dictionary в Swift, и я хотел бы получить ключ по определенному индексу.
var myDict : Dictionary<String,MyClass> = Dictionary<String,MyClass>()
Я знаю, что могу перебирать ключи и записывать их в журнал
for key in myDict.keys{
NSLog("key = (key)")
}
Однако, как ни странно, что-то подобное невозможно
var key : String = myDict.keys[0]
Почему ?
10 ответов:
Это потому, что
keysвозвращаетLazyMapCollection<[Key : Value], Key>, который не может быть подписан с помощью Int. Один из способов справиться с этим заключается в продвижении словаряstartIndexна целое число, которое вы хотите индексировать, например:let intIndex = 1 // where intIndex < myDictionary.count let index = myDictionary.startIndex.advancedBy(intIndex) // index 1 myDictionary.keys[index]Другое возможное решение, было бы инициализировать массив с
keysв качестве входных данных, то вы можете использовать целочисленные индексы на результат:Помните, что словари по своей природе неупорядочены, поэтому не ожидайте, что ключ в данном индексе всегда будет одним и тем же.let firstKey = Array(myDictionary.keys)[0] // or .first
Swift 3:
Array()может быть полезно для этого .Получить Ключ:
let index = 5 // Int Value Array(myDict)[index].keyПолучить Значение:
Array(myDict)[index].value
Вот небольшое расширение для доступа к ключам и значениям в словаре по индексу:
extension Dictionary { subscript(i:Int) -> (key:Key,value:Value) { get { return self[startIndex.advancedBy(i)] } } }
Вы можете перебирать словарь и брать индекс с for-in и перечислять (как говорили другие, нет никакой гарантии, что он выйдет упорядоченным, как показано ниже)
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) }Если вы хотите сначала отсортировать..
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)]Затем повторите.
for (index, entry) in enumerate(sortedKeysArray) { println(index) // 0 1 2 println(entry.0) // a c d println(entry.1) // 456 123 45 }Если вы хотите создать упорядоченный словарь,вам следует обратиться к обобщениям.
Если вам нужно использовать ключи или значения словаря с API, который принимает экземпляр массива, инициализируйте новый массив с помощью свойства keys or values:
let airportCodes = [String](airports.keys) // airportCodes is ["TYO", "LHR"] let airportNames = [String](airports.values) // airportNames is ["Tokyo", "London Heathrow"]
Свифт 3. Пример для первого элемента
let wordByLanguage = ["English": 5, "Spanish": 4, "Polish": 3, "Arabic": 2] if let firstLang = wordByLanguage.first?.key { print(firstLang) // English }
В Swift 3 Попробуйте использовать этот код для получения пары ключ-значение (кортеж) при заданном индексе:
extension Dictionary { subscript(i:Int) -> (key:Key,value:Value) { get { return self[index(startIndex, offsetBy: i)]; } } }
Вот пример использования 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
SWIFT 4
Немного не по теме: но вот если у вас есть массив словарей то есть: [[строка : строка]]
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
Я искал что-то вроде LinkedHashMap на Java. Ни у Swift, ни у Objective-C его нет, если я не ошибаюсь.
Моя первоначальная мысль была, чтобы обернуть мой словарь в массив.
[[String: UIImage]]но потом я понял, что хватать ключ из словаря было глупо сArray(dict)[index].key, поэтому я пошел с кортежами. Теперь мой массив выглядит как[(String, UIImage)], поэтому я могу получить его поtuple.0. Больше никаких преобразований в массив. Только мои 2 цента.
Comments