Измените House
структуру на это:
House: Decodable {
let id: String
let name: String
let url: String
let img: String
}
id
должно быть String
. И чтобы получить дома:
let houses = try JSONDecoder().decode(ServerStatus.self, from: data).data.houses
Если вы не хотите изменять id
, поступающий с сервера, на Int
, вы можете предоставить собственную реализацию Encodable и Decodable, чтобы определить собственную логику кодирования и декодирования.
struct House {
let id: Int
let img: String
let name: String
let url: String
enum CodingKeys: String, CodingKey {
case id, img, name, url
}
}
extension House: Decodable {
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
guard let idInt = Int(try values.decode(String.self, forKey: .id)) else {
fatalError("The id is not an Int")
}
id = idInt
img = try values.decode(String.self, forKey: .img)
name = try values.decode(String.self, forKey: .name)
url = try values.decode(String.self, forKey: .url)
}
}
//Just in case you want to encode the House struct
extension House: Encodable {
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(String(id), forKey: .id)
try container.encode(img, forKey: .img)
try container.encode(name, forKey: .name)
try container.encode(url, forKey: .url)
}
}
let decoder = JSONDecoder()
let data = """
{
"status": true,
"data": {
"img_url": "/images/houses/",
"houses": [
{
"id": "1",
"name": "Kapital",
"url": "https://kapital.com/",
"img": "10fbf4bf6fd2928affb180.svg"
}
]
}
}
""".data(using: .utf8)!
let houses = try JSONDecoder().decode(ServerStatus.self, from: data).data.houses
print(houses)