Как заполнить tableview значениями-ключами по словарю?

#json #swift #dictionary #key-value

#json #swift #словарь #ключ-значение

Вопрос:

У меня есть локальный файл JSON под названием ItemInfo.json, который содержит один словарь с почти 6000 парами ключ-значение, состоящими из имени элемента и идентификатора элемента.

 { "itemName1" : 2564,
  "itemName2" : 470,
  "itemName3" : 1849,
  "itemName4" : 60,
  "itemName5" : 103 }
// continues for a few thousand more
  

У меня нет проблем, когда дело доходит до загрузки файла JSON в консоль, но я не знаю, как распечатать имена элементов в tableview в виде списка. Идентификаторы в списке не нужны, так как я просто хочу напечатать имена.

 public class DataLoader {

    @Published var userData: [String:Int] = [:]

    init() {
      load()
}

   func load() {
        
    if let fileLocation = Bundle.main.url(forResource: "itemInfo", withExtension: "json") {

    do {

                let data = try Data(contentsOf: fileLocation)

                let jsonDecoder = JSONDecoder()

                let dataFromJson = try jsonDecoder.decode([ String: Int].self, from: data)

                self.userData = dataFromJson

               } catch {

                print(error)

            }
        }
     }
 }
  

Как мне заполнить tableview всеми именами элементов в TableViewController?

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

        
        cell.textLabel!.text = // not sure what goes here to populate list with names.

      
 return cell

    }
  

Ответ №1:

Объявить userData как массив. Заменить

 @Published var userData: [String:Int] = [:]
  

с помощью

 @Published var userData: [String] = []
  

и присвоить ключи словаря массиву

 self.userData = Array(dataFromJson.keys)
  

В cellForRow отобразить элемент с заданным индексом

 cell.textLabel!.text = userData[indexPath.row]
  

Комментарии:

1. Спасибо за ваш ответ. Я пошел дальше и попробовал это, и он говорит «Нет точных совпадений при вызове инициализатора». У меня нет структуры item, но я не уверен, нужна ли она. Я попытался также изменить декодер на JSONDecoder.decode([String].self, из: data), и это дало мне «Тип выражения ‘()’ неоднозначен без дополнительного контекста».

2. Большое вам спасибо! Это, казалось, сделало свое дело! Теперь это тоже имеет смысл, ха-ха, спасибо!!