Используйте Кодируемый протокол для кодирования вашего типа структуры cutom CollegeRequest. Ваша структура нуждается в ручном кодировании
Если структура вашего типа Swift отличается от структуры его закодированной формы, вы можете предоставить собственную реализацию Encodable и Decodable для определения собственной логики кодирования и декодирования c. source
Чтобы кодировать CollegeRequest в тип данных, используйте JSONEncoder . Объект, который кодирует экземпляры типа данных как JSON объекты.
Относительно сохраненного свойства даты вы должны использовать JSONEncoder.DateEncodingStrategy.formatted (_:) , стратегия, которая откладывает настройки форматирования на предоставленный форматер даты.
struct CollegeRequest: Codable {
struct Student: Codable {
var id: Int
var name: String
}
var student: Student
var date: Date
enum CodingKeys: String, CodingKey {
case studentId = "student.id"
case studentName = "student.name"
case date
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(student.id, forKey: .studentId)
try container.encode(student.name, forKey: .studentName)
try container.encode(date, forKey: .date)
}
init(student: CollegeRequest.Student, date: Date) {
self.student = student
self.date = date
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
let studentId = try values.decode(Int.self, forKey: .studentId)
let studentName = try values.decode(String.self, forKey: .studentName)
student = Student(id: studentId, name: studentName)
date = try values.decode(Date.self, forKey: .date)
}
}
Использование
let request = CollegeRequest(student: CollegeRequest.Student(id: 1, name: "John"), date: Date())
let jsonEncoder = JSONEncoder()
let df = { let df = DateFormatter(); df.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"; return df }() as DateFormatter
jsonEncoder.dateEncodingStrategy = .formatted(df)
let a: Data? = try? jsonEncoder.encode(request)