Как получить ключ по определенному индексу из словаря в 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]


Почему ?

744   10  

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
}

Если вы хотите создать упорядоченный словарь,вам следует обратиться к обобщениям.

От https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/CollectionTypes.html:

Если вам нужно использовать ключи или значения словаря с 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

    Ничего не найдено.