Спасибо, приму к сведению.
Не могу распарсить данные JSON
RexHunt
#22
Т.е. ошибка на сервере, из-за кривых кавычек «animal_about"…
Не повезло вам с backend’ом
NONAME8
#23
Еще по вашему примеру разобрался, как достать фотографию.
Тоже сделал промежуточный класс. Оставлю код, может кому пригодится:
Как распарсить:
class AnimalData: Codable {
let animalName: String
let animalAbout: String
let animalImage: AnimalImage
init(animal_title: String, animal_about: String, animal_image: AnimalImage){
self.animalName = animal_title
self.animalAbout = animal_about
self.animalImage = animal_image
}
private enum CodingKeys: String, CodingKey {
case animalName = "animal_title"
case animalAbout = "animal_about"
case animalImage = "animal_image"
}
}
class AnimalImage: Codable{
let alt: String
let src: String
init(alt: String,src: String){
self.alt = alt
self.src = src
}
private enum CodingKeys: String, CodingKey {
case alt = "alt"
case src = "src"
}
}
И как из это выложить в TableView:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as? CustomCell else { return UITableViewCell() }
cell.name.text = "Name: " + animals[indexPath.row].animal.animalName
cell.about.text = "About: " + animals[indexPath.row].animal.animalAbout
if let imageURL = URL(string: animals[indexPath.row].animal.animalImage.src) {
DispatchQueue.global().async {
let data = try? Data(contentsOf: imageURL)
if let data = data {
let image = UIImage(data: data)
DispatchQueue.main.async {
cell.img.image = image
}
}
}
}
return cell
}
RexHunt
#24
Еще маленький совет дам:
1 - что бы не обращаться каждый раз в массив animals[indexPath.row], сделайте переменную
let animal = animals[indexPath.row].animal
2 - всю логику по заполнению ячейки, лучше всего вынести в CustomCell. Сделайте там метод, что-то вроде
func bind(to model: AnimalData) {
тут уже заполняете элементы ячейки данными + загрузка картинки
}
И тогда контроллер будет смотреться элегантнее и проще
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as? CustomCell else { return UITableViewCell() }
let animal = animals[indexPath.row].animal
cell.bind(to: animal)
return cell
}