У меня есть Dictionary
Swift, и я хотел бы получить ключ по определенному индексу.
var myDict : Dictionary<String,MyClass> = Dictionary<String,MyClass>()
Я знаю, что могу перебирать ключи и регистрировать их
for key in myDict.keys{
NSLog("key = \(key)")
}
Однако, как ни странно, что-то подобное невозможно.
var key : String = myDict.keys[0]
Зачем ?
ios
dictionary
swift
the_critic
источник
источник
Ответы:
Это потому, что
keys
возвратыLazyMapCollection<[Key : Value], Key>
, которые не могут быть подписаны с помощьюInt
. Один из способов справиться с этим - продвинуть словарьstartIndex
на целое число, на которое вы хотите добавить индекс, например:Другим возможным решением было бы инициализировать массив
keys
как входные данные, после чего вы можете использовать целые индексы в результате:Помните, что словари по своей природе неупорядочены, поэтому не ожидайте, что ключ по данному индексу всегда будет одним и тем же.
источник
Array(myDict)[0].0
поскольку он не будет копировать массив ключей и не должен копировать внутренние структуры словаря, хотя может.myDict[keysArray[0]]
.'NSDictionary' is not convertible to '_ArrayBuffer<T>'
Swift 3:
Array()
может быть полезно для этого.Получить ключ:
Получите ценность:
источник
["a": 1, "b": 2]
, можно превратить в массив словарей, например[[key: "a", value: 1], [key: "b", value: 2]]
, тогда к нему можно будет получить доступ по индексу.Вот небольшое расширение для доступа к ключам и значениям в словаре по индексу:
источник
Вы можете перебирать словарь и получать индекс с помощью for-in и enumerate (как говорили другие, нет никакой гарантии, что он будет упорядочен, как показано ниже)
Если вы хотите сначала отсортировать ...
затем повторите.
Если вы хотите создать упорядоченный словарь, вам следует изучить Generics.
источник
dict.enumerated().forEach { (index, element) in ... }
Из https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/CollectionTypes.html :
Если вам нужно использовать ключи или значения словаря с API, который принимает экземпляр Array, инициализируйте новый массив с помощью свойства keys или values:
источник
SWIFT 3. Пример для первого элемента
источник
В Swift 3 попробуйте использовать этот код для получения пары ключ-значение (кортежа) по заданному индексу:
источник
Вот пример с использованием Swift 1.2
источник
SWIFT 4
Немного не по теме: но вот если у вас есть массив словарей, например: [[String: String]]
источник
Я искал что-то вроде LinkedHashMap на Java. Ни у Swift, ни у Objective-C его нет, если я не ошибаюсь.
Моя первоначальная мысль заключалась в том, чтобы обернуть мой словарь в массив.
[[String: UIImage]]
но потом я понял, что брать ключ из словаря было нелепо,Array(dict)[index].key
поэтому я выбрал кортежи. Теперь мой массив выглядит[(String, UIImage)]
так, что я могу его получитьtuple.0
. Больше не нужно преобразовывать его в массив. Только мои 2 цента.источник