Как получить ключ от определенного индекса из словаря в 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]
Почему?
Ответы
Ответ 1
Это потому, что 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
Помните, словари по своей сути неупорядочены, поэтому не ожидайте, что ключ в данном индексе всегда будет одним и тем же.
Ответ 2
Swift 3: Array()
может быть полезно для этого.
Получить ключ:
let index = 5 // Int Value
Array(myDict)[index].key
Получить значение:
Array(myDict)[index].value
Ответ 3
Вот небольшое расширение для доступа к ключам и значениям в словаре по индексу:
extension Dictionary {
subscript(i: Int) -> (key: Key, value: Value) {
return self[startIndex.advancedBy(i)]
}
}
Ответ 4
Вы можете выполнять итерацию по словарю и захватывать индекс со входом и перечислением (как говорили другие, нет гарантии, что он выйдет так, как показано ниже)
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
}
Если вы хотите создать упорядоченный словарь, вы должны посмотреть на Generics.
Ответ 5
Из https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/CollectionTypes.html:
Если вам нужно использовать ключи или значения словарей с API, который принимает экземпляр Array, инициализируйте новый массив с помощью свойств ключей или значений:
let airportCodes = [String](airports.keys) // airportCodes is ["TYO", "LHR"]
let airportNames = [String](airports.values) // airportNames is ["Tokyo", "London Heathrow"]
Ответ 6
SWIFT 3. Пример для первого элемента
let wordByLanguage = ["English": 5, "Spanish": 4, "Polish": 3, "Arabic": 2]
if let firstLang = wordByLanguage.first?.key {
print(firstLang) // English
}
Ответ 7
В Swift 3 попробуйте использовать этот код для получения пары значений ключа (кортежа) при заданном индексе:
extension Dictionary {
subscript(i:Int) -> (key:Key,value:Value) {
get {
return self[index(startIndex, offsetBy: i)];
}
}
}
Ответ 8
Вот пример, используя 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
Ответ 9
SWIFT 4
Немного не по теме: но если у вас есть массив словарей, то есть: [[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
Ответ 10
В SWIFT 4 вы можете делать то, что вы хотели:
let dic = [1 : "First", 2 : "Second", 3 : "third"]
for key in dic.keys {
print(key)
}
Ответ 11
Я искал что-то вроде LinkedHashMap в Java. Ни у Swift, ни у Objective-C такого нет, если я не ошибаюсь.
Моей первоначальной мыслью было завернуть мой словарь в массив. [[String: UIImage]]
но потом я понял, что захват ключа из словаря дурацкий с Array(dict)[index].key
поэтому я пошел с Tuples. Теперь мой массив выглядит как [(String, UIImage)]
поэтому я могу получить его с помощью tuple.0
. Больше не нужно преобразовывать его в массив. Просто мои 2 цента.