Поскольку вы несете ответственность за JSON, удалите вмещающий словарь data
, он не нужен.
[{
"name":"Lion",
"thumbnail":"https://kopelion.org/wp-content/uploads/2016/10/Kimani.jpg",
"region":"Africa",
"stats":{
"max_weight":180,
"length":250
}
}]
Создайте две структуры
struct Animal: Decodable {
let name: String
let thumbnail: URL
let region: String
let stats: Stats
}
struct Stats: Decodable {
let maxWeight, length: Int
}
В контроллере представления объявите данныеисходный массив
var animals = [Animal]()
В viewDidLoad
анализирует данные с помощью JSONDecoder
и присваивает результат массиву источника данных
override func viewDidLoad() {
super.viewDidLoad()
let url = Bundle.main.url(forResource: "data", withExtension: "json")!
let data = try! Data(contentsOf: url)
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
self.animals = try! decoder.decode([Animal].self, from: data)
}
Все guard
с и try
сна самом деле не нужны.Файл должен существовать во время компиляции и не может быть изменен во время выполнения, поэтому код не должен давать сбой.
Вы можете получить свойства животного с помощью
let animal = animals[0]
let name = animal.name
let weight = animal.stats.weight
print(name, weight)
Предполагая, что естьбольше животных в JSON используют цикл
for animal in animals {
let name = animal.name
let weight = animal.stats.weight
print(name, weight)
}
Как обновить метки неясно, потому что в вашем вопросе нет существенной информации о дизайне.
Чтобы получить изображение, загрузите егоасинхронно с URLSession