Доступ к значению в словаре с помощью переменной int в Swift - PullRequest
0 голосов
/ 08 июня 2019

Я разрабатываю приложение для iOS и хочу получить доступ к определенному значению в Словаре, используя Array().

Мой словарь содержит массив, который содержит структуры.

let array = [(key: "S", value: [Thunderbolt.repoStruct(repoName: "Semiak Repo", repoURL: "https://repo.semiak.dev", icon: Optional("iconRound"))]), (key: "T", value: [Thunderbolt.repoStruct(repoName: "Thunderbolt iOS Utilities", repoURL: "https://repo.thunderbolt.semiak.dev", icon: Optional("iconRound"))])]

Я делаю UITableView с массивом: имя раздела - это значение key, заголовок ячейки - это значение repoStruct.repoName, и то же самое со следующими значениями.

Для доступа к repoNameЯ бы использовал Array(array)[0].1[0].repoName.

Проблема в том, что я не знаю точное местоположение, к которому я хочу получить доступ, вместо этого я использую indexPath, чтобы узнать, какое значение мне нужно:

Array(array)[indexPath.section].indexPath.row[0].repoName

Это должно вернуть мне repoName ячейки, но вместо этого выдает следующую ошибку: Value of tuple type '(key: String, value: [repoStruct])' has no member 'indexPath'

Я также попытался использовать:

let row = indexPath.row
Array(array)[indexPath.section].row[0].repoName

, но выдает ту же ошибку:Value of tuple type '(key: String, value: [repoStruct])' has no member 'row'

Я не знаю, почему Array(array)[0].1 работает и возвращает мне значение, но Array(array)[indexPath.section].row нет.Он делает то же самое: доступ к значению с использованием позиции, которая является целым числом, например indexPath.

Как я могу это сделать?

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 08 июня 2019

Прежде всего, ваш array уже является массивом, поэтому нет необходимости говорить, что Array(array) - достаточно просто array, хотя таких общих имен следует избегать.

Не знаю, почему array[0].1[0] работает

Давайте разберем это - вы обращаетесь к первому элементу в array через [0] и в этом, ко второму элементу кортежа .1 и, наконец, к первому элементу этого массива value. Вы можете использовать array[0].value[0] для того же эффекта и сделать код более читабельным.

но array[indexPath.section].row не

Это потому, что ваш массив не содержит ничего, что называется row.

Вместо этого используйте array[indexPath.section].value[indexPath.row].repoName.

1 голос
/ 13 июня 2019

Пожалуйста, попробуйте этот код.

let dictData = arr[indexpath.section] //Element of section
let value = dictData["value"] //Value added in value in The element
let name = value[indexpath.row].reponame //Gives you name
1 голос
/ 08 июня 2019

Настоятельно не рекомендуется использовать кортежи в массиве источника данных. Замените кортеж дополнительной структурой

struct Section {
    let name : String
    let items : [Thunderbolt.repoStruct]
}

let array = [Section(name: "S", items: [Thunderbolt.repoStruct(repoName: "Semiak Repo", repoURL: "https://repo.semiak.dev", icon: Optional("iconRound"))], 
             Section(name: "T", items: [Thunderbolt.repoStruct(repoName: "Thunderbolt iOS Utilities", repoURL: "https://repo.thunderbolt.semiak.dev", icon: Optional("iconRound"))]]

и получите предмет по индексному пути

let section = array[indexPath.section]
let item = section.items[indexPath.row]
let name = item.repoName
...