У меня самая странная проблема. После выполнения сериализации JSON и создания объекта происходит сбой кода при попытке доступа к любым свойствам подкласса. Когда я пытаюсь получить доступ к свойствам суперкласса объекта, они печатаются правильно.
Вот класс:
import UIKit
class Patient: Person {
var approved: Bool
var doctorId: Int
private enum CodingKeys: String, CodingKey {
case approved
case doctorId
}
init(id: String, name: String, lastName: String, phoneNumber: String, email: String, imageURL:URL, approved:Bool, doctorId:Int) {
self.approved = approved
self.doctorId = doctorId
super.init(id: id, firstName: name, lastName: lastName, imageURL: imageURL)
}
required init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
self.approved = try values.decode(Bool.self, forKey: .approved)
self.doctorId = try values.decode(Int.self, forKey: .doctorId)
try super.init(from: decoder)
}
var description: String {
return "\(type(of: self)) - (\(self.firstName), \(self.lastName))" //superclass properties
}
}
struct PatientsList : Codable {
let patients: [Patient]
}
Класс человека:
class Person: Codable {
let firstName: String
let lastName: String
let imageURL: URL?
let id: String
private enum CodingKeys: String, CodingKey {
case firstName
case lastName
case imageURL = "profileImgPath"
case id = "_id"
}
init(id: String, firstName: String, lastName: String, imageURL:URL) {
self.id = id
self.firstName = firstName
self.lastName = lastName
self.imageURL = imageURL
}
required init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
self.id = try values.decode(String.self, forKey: .id)
self.firstName = try values.decode(String.self, forKey: .firstName)
self.lastName = try values.decode(String.self, forKey: .lastName)
self.imageURL = try values.decodeIfPresent(URL.self, forKey: .imageURL)
}
}
Вот как я выполняю сериализацию:
do {
let jsonData = try JSONSerialization.data(withJSONObject: JSON, options: [])
let decoder = JSONDecoder()
let patientList = try! decoder.decode(PatientsList.self, from: jsonData)
completionBlock(.success(patientList.patients))
} catch {
print(error.localizedDescription)
}
Вот
// в консоли: po (Patient.approved) печатает false
// в консоли: выражение dump (пациент)
▿ iHeal.Patient # 0 ▿ супер: iHeal.Person
firstName: "Sarah"
lastName: "Connor"
imageURL: nil
id: "5b367491052aaca6489e4805"
Дата рождения: "1980-06-10T00: 00: 00.000Z"
утверждено: false
doctorId: 12
print(patient.approved) //crash
print(patient.doctorId) // if I comment out previous line, this one crashes
Тема 1: EXC_BAD_ACCESS (код = 1, адрес = 0x200000002)
Еще одна странная вещь, которую я могу упомянуть: описание не вызывается у пациента
print(patient) // prints plain: <Patient: 0x608000141c30>
Json:
{
"patients": [
{
"approved": false,
"_id": "5b367491052aaca6489e4805",
"birthDate": "1980-06-10T00:00:00.000Z",
"doctorId": 12,
"firstName": "Sarah",
"lastName": "Connor"
},
{
"approved": false,
"drains": [],
"_id": "5b3674e5052aaca6489e66b3",
"__v": 0,
"birthDate": "1980-06-10T00:00:00.000Z",
"doctorId": 12,
"firstName": "Sarah",
"lastName": "Connor"
}
]
}