В ES6 / ES2015 или более поздней версии вы можете сделать так:
objs.sort((a, b) => a.last_nom.localeCompare(b.last_nom));
Два вопроса.
Чтобы использовать quoteArray
, вы должны скопировать массив, содержащий кавычки
self.websiteObject = try decoder.decode(WebsiteObjectStruct.self, from: data)
self.quoteArray = self.websiteObject.contents.quotes ?? []
DispatchQueue.main.async {
self.tableView.reloadData()
}
В 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
}
Немного сложно понять ошибку с кодом, который вы разместили. Я думаю, что проблема может быть с определением типа переменной 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.
Код предназначен только для проверки ваших структур, не ожидайте проекта с чистым кодом;)
Приложение вызывает [ 115] в viewDidLoad
, используя стиль ячейки subtitle
, пользовательский интерфейс выглядит следующим образом: