Декодированные поля JSON дают только нулевые значения, не могут быть сохранены в переменные

В ES6 / ES2015 или более поздней версии вы можете сделать так:

objs.sort((a, b) => a.last_nom.localeCompare(b.last_nom));
0
задан orbek1815 6 February 2019 в 03:48
поделиться

2 ответа

Два вопроса.

  1. Чтобы использовать quoteArray, вы должны скопировать массив, содержащий кавычки

    self.websiteObject = try decoder.decode(WebsiteObjectStruct.self, from: data)
    self.quoteArray = self.websiteObject.contents.quotes ?? []
    DispatchQueue.main.async {
        self.tableView.reloadData()
    }
    
  2. В cellForRow вы должны получить элемент по заданный путь индекса. И исключают из ячейки, устанавливают стиль в Интерфейсном Разработчике.

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
        let cell = tableview.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath)
        let quote = quoteArray[indexPath.row]
        cell.textLabel?.text = quote.author
        cell.detailTextLabel?.text = quote.quote
        return cell
    }
    
0
ответ дан vadian 6 February 2019 в 03:48
поделиться

Немного сложно понять ошибку с кодом, который вы разместили. Я думаю, что проблема может быть с определением типа переменной websiteObject. Я создал небольшую игровую площадку, чтобы проверить ее, и у вас все хорошо.

Я создаю небольшой проект, который работает нормально, используя ваши структуры. Вы можете проверить это здесь: https://github.com/acyrman/StackOverflow54211226 .

Соответствующее изменение в функции fetchJSON. Вместо использования self.websiteObject, который я не знал, как вы его определили, я использовал локальную переменную, подобную этой: let websiteObject = try decoder.decode(WebsiteObjectStruct.self, from: data), затем продолжаю получать кавычки и назначать вашу переменную quoteArray.

fileprivate func fetchJSON() {
    let urlString = "http://quotes.rest/qod.json?category=inspire"
    guard let url = URL(string: urlString) else { return }
    URLSession.shared.dataTask(with: url) { [weak self] (data, response, error) in
        if error != nil {
            self?.displayAlert("Error fetching data: \(String(describing: error?.localizedDescription))")
        }

        let decoder = JSONDecoder()
        do {
            guard let data = data else { throw NSError(domain: "this.app", code: -1, userInfo: nil) }

            let websiteObject = try decoder.decode(WebsiteObjectStruct.self, from: data)
            if let quotesArray = websiteObject.contents.quotes {
                DispatchQueue.main.async {
                    self?.quoteArray = quotesArray
                    self?.tableView.reloadData()
                }
            }
        } catch let error {
            self?.displayAlert("Error decoding json data: \(String(describing: error.localizedDescription))")
        }
    }.resume()
}

Для приложения я получаю цитату из: http://quotes.rest/qod.json?category=inspire . Также в info.plist важно включить настройки ATS, чтобы включить выборку данных из URL-адреса, отличного от https.

enter image description here

Код предназначен только для проверки ваших структур, не ожидайте проекта с чистым кодом;)

Приложение вызывает [ 115] в viewDidLoad, используя стиль ячейки subtitle, пользовательский интерфейс выглядит следующим образом:

enter image description here

0
ответ дан Aaron Cyrman 6 February 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: