Ошибка возникает из-за невозможности преобразования десериализованного значения словаря JSON в пользовательскую структуру.Вам придется создавать другие структуры, вызывая их init
методы, такие как SuperHero
.
Поскольку ваши структуры соответствуют Decodable
, в любом случае используйте JSONDecoder
, просто замените responseJSON
на responseData
наполучить необработанные данные.
Вы можете объявить все элементы в корневой структуре как необязательные
struct SuperHero: Decodable {
let name: String
let powerstats: PowerStats
let appearance: Appearance
let biography: Biography
let work: Work
let images: Images
}
, и все члены в Images
могут быть непосредственно декодированы в URL
struct Images: Decodable {
let xs: URL
let sm: URL
let md: URL
let lg: URL
}
func fetchData() {
guard let url = URL(string: url) else { return }
request(url).validate().responseData { (dataResponse) in
switch dataResponse.result {
case .success(let data):
do {
self.superHeroes = try JSONDecoder().decode([SuperHero].self, from: data)
DispatchQueue.main.async {
self.collectionView.reloadData()
}
} catch { print(error) }
case.failure(let error):
print(error)
}
}
}
Чтобы создать дочерние структуры в коде, вы должны создать каждый отдельный экземпляр.Это пример для PowerStats
for dict in arrayOfItems {
let pwstats = dict["powerstats"] as! [String:Int]
let powerStat = PowerStats(intelligence: pwstats["intelligence"]!,
strength: pwstats["strength"]!,
speed: pwstats["speed"]!,
durability: pwstats["durability"]!,
power: pwstats["power"]!,
combat: pwstats["combat"]!)
let superHero = SuperHero(name: dict["name"] as? String,
powerstats: powerStat, ...
Имейте в виду, что большинство словарей имеют [String:Any]
, что требует дополнительного приведения типов для каждого значения.