Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift:如何将结构转换为字典以及分层键_Ios_Swift_Codable - Fatal编程技术网

Ios Swift:如何将结构转换为字典以及分层键

Ios Swift:如何将结构转换为字典以及分层键,ios,swift,codable,Ios,Swift,Codable,我想将CollegeRequest类型转换为字典或数据,以便在请求POST-API时将其发送到服务器 以下是我的CollegeRequest类型: 与分层键一起转换后,应如下所示: { "student.id": 3, "student.name": "Raj", "date": "2019-10-31T13:59:00+00:00" } 如何实现这一点?用于对cutom结构类型CollegeRequest进行编码。您的结构需要手动编码 如果您的Swift类型的结构与其 编码形式,

我想将CollegeRequest类型转换为字典或数据,以便在请求POST-API时将其发送到服务器

以下是我的CollegeRequest类型:

与分层键一起转换后,应如下所示:

{
  "student.id": 3,
  "student.name": "Raj",
  "date": "2019-10-31T13:59:00+00:00"
}
如何实现这一点?

用于对cutom结构类型CollegeRequest进行编码。您的结构需要手动编码

如果您的Swift类型的结构与其 编码形式,您可以提供可编码和 可解码以定义自己的编码和解码逻辑

要将CollegeRequest编码为数据类型,请使用。将数据类型的实例编码为JSON对象的对象

关于您必须使用的日期存储属性,将格式设置延迟到提供的日期格式化程序的策略

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)
    }

}
用法


什么是可发送的?你知道Codable吗?请告诉我这不是一个实际的问题。转换'Struct'类..很抱歉,这与问题无关,但我是被这个问题触发的。请阅读class和struct之间的区别如果您想要JSON:1采用可编码2指定并翻译所有编码键,例如case id=student.id 3实现encodeto编码器并手动编码所有内容。•如果您想要一个字典来编写一个自定义方法,那么这比先转换为JSON/PropertyList,然后再转换为dictionary@RobNapierAnswer UpdateMy结构是可编码的,它不可编码。它抛出可解码错误类型“CollegeRequest”不符合协议“decodable”
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)