Лучшее решение тогда похоже Array(dictionary)
У вас получится Array(dictionary)[index].key
- ключи
Array(dictionary)[index].value
- значения.
Правда, тут вам лучше будет отсортировать словарь по чему-либо, чтобы избежать путаницы.
Как передать dictionary в TableView
насчет ссылки понятно, но я имел в виду данный конкретный случай. Например, преобразовываем словарь в массив:
var array = Array(dictionary)
Этот массив имеет следующую структуру:
[(key: String, value: [String])]
Т.е. получается, что словарь завернут в тюпл и вставлен в массив.
И как теперь достать те же ключи? Если использовать ваш пример, то что нужно вставить в квадратные скобки, там где индекс?
array[index].key
Maxim, это уже несмешно! Тут большинство новичков, как и я, и форум для того и нужен, чтобы разбирать сложные для кого-то вопросы и помогать начинающим. Но просить прочитать учебник другого за себя - это слишком.
это полностью взаимоисключающие фразы, которые озночают, что вы, либо не читали, либо совершенно невнимательны! Там полностью есть ответ на все ваши вопросы по массивам, причём не для профи, а для обычных новичков написано понятным языком: во-первых в самом начале, а во-вторых в разделе Доступ и изменение массива
. Ещё раз честно и с желанием помочь - с такой внимательностью, вам просто надо сесть за плейграунд и перечитать весь учебник! Один, два, сколько понадобится раз, чтобы самому себе ответить - понял раздел или нет. В учебнике только БАЗА! И её непонимание - катастрофично!
Удачи!
ODIN я ценю вашу помощь, но при всем уважении мы похоже друг друга не поняли.
Если указывается индекс в выражении, например:
array[0].key
то возвращается только один ключ. А речь идет о том, чтобы получить все ключи.
речь идёт о том, что всё же учебник вам не помешает
-
количество элементов в массиве вычисляется свойством
.count
-
массив можно перебрать в цикле, получив каждый элемент (ещё можно использовать в цикле свойство
.enumerated()
- изучите, тоже часто полезно) -
любой ваш контроллер - это класс. У классов могут быть методы (функции) и свойства (переменные), или классы могут быть подписаны на протоколы, например. Так вот при использовании таблиц в той или иной мере участвует протокол
UITableViewDataSource
у которого есть 2 метода:
один опередялет количество строк в одной секции вашей таблице (обычно для формирования и хранения данных для таблиц используют массивы, но это по желанию и может быть вообще любая форма)func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return array.count
}
другой формирует ячейку(строку) для всех элементов (строк) вашей таблицы, количество которых вычесленно предыдущим методом
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
...
return cell
}
так вот получается что этот (второй) метод вызывается столько раз, сколько возвращено в первом (это int
). И в нём можно обратиться к каждому элементу массива используя вычисляемые свойства второго метода - это indexPath
"IndexPath
represents the path to a specific node in a tree of nested array collections.
_ Each index in an index path represents the index into an array of children from one node in the tree to another, deeper, node."_ описание из xCode - переводчик в помощь;
у него есть также вычисляемое свойство .row
(строка), которое как раз является Int
и меняется от 0 до array.count
или любого Int
, возвращённого в первом методе.
Подробнее некуда.
спасибо за “курс молодого бойца”)) это все понятно, но тем не менее не отвечает на вопросы, которые возникают по ходу.
В любом случае спасибо за помощь, вопрос уже решен. Даже написал небольшую методичку для таких как я, ищущих ответы на вопросы.
В продолжение темы, а есть ли какая разница между первым и вторым вариантом, ведь и там, и там можно достать и ключ, и значение?
А почему второй? Мне что-то показалось, что как раз он более уязвимый, потому как получаем два отдельных массива со всеми вытекающими.