Возможно, вы захотите попробовать следующее, что, кажется, прекрасно работает для меня.
Сначала нам нужно создать CodingKeys
для нашей структуры User
При работе с кодируемым,даже если Member
и Grade
внутри элемента вложены друг в друга.Вы должны объявить эти структуры вне структуры User.
Как видно из приведенного ниже, член и класс должны соответствовать Codable
, тогда как пользователь соответствует Decodable
в расширении и инициализируется с помощью декодера, используя его в качестве контейнера.
Также, поскольку в вашем json-файле у вас есть id
как String
как в User, так и в Grade, но в вашем коде вы объявили их как Int
, поэтому я также исправил их.
Приведенный ниже код реализует структуры и CodingKeys, как я уже упоминал выше, попытайтесь приблизиться, как я, или попробуйте скопировать его, и все будет в порядке:
Структура пользователя с CodingKeys:
struct User {
var status: Int?
var member: Member?
enum CodingKeys: String, CodingKey {
case status = "status"
case member = "member"
}
}
Структуры члена и класса:
struct Member: Codable {
var id: String?
var member_no: String?
var username: String?
var name: String?
var email: String?
var phone: String?
var point: String?
var expiry: String?
var grade: Grade?
}
struct Grade: Codable {
var id: String?
var name: String?
}
Расширение для пользователя для соответствия Codable:
extension User: Decodable {
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.status = try container.decode(Int?.self, forKey: .status)
self.member = try container.decode(Member?.self, forKey: .member)
}
}
Теперь создайте декодер и попробуйте декодировать его следующим образом:
let decoder = JSONDecoder()
let user = try! decoder.decode(User.self, from: data)
Надеюсь, это поможет и отлично сработает для вас