Я не думаю, что moreDetailsArray должен быть массивом.
Я бы реализовал это так:
struct Student: Decodable, CustomStringConvertible {
let id: Int
let name: String
let moreDetail: StudentoreDetail
var description: String {
return "\(name) : \(additionalInformation.description)"
}
}
struct StudentAdditionalInfo: Decodable, CustomStringConvertible {
let type: String
let status: String
var description: String {
return "\(type) : \(status)"
}
}
тогда все, что вам нужно сделать, это:
guard let data = data,
let students = try? JSONDecoder().decode([Student].self, from: data) else {
print("[DEBUG] - No data/json"
return
}
for student in students {
print(student.description)
}
если ваши moreDetails на самом деле являются массивом, вы можете просто выбрать первый элемент, если он существует.
struct Student: Decodable, CustomStringConvertible {
let id: Int
let name: String
let moreDetail: StudentMoreDetail
var description: String {
return "\(name) : \(moreDetail.first?.description)"
}
}
Дополнительные советы:
- Не открывайте принудительно, т.е.
JSONDecoder().decode([StudentData].self, from: data**!**)
- Назовите новые типы, такие как классы, структуры, перечисления и т. Д. В соответствующем регистре (заглавная буква)
- Постарайтесь следовать золотому пути, здесь вам может помочь охранное заявление.
- Не называйте такие вещи, как moreDetailsArray, который был структурой, а не массивом, хотя вы используете его в массиве