Ios 多部分请求-带UIImage的可编码结构

Ios 多部分请求-带UIImage的可编码结构,ios,json,swift,encodable,Ios,Json,Swift,Encodable,使用Swift 5,我试图减少很多依赖项(Alamofire),并且我试图理解在使用Codable和URLRequest时如何执行多部分请求 我的代码可以正确地创建一个有名字和电子邮件的用户,但是我需要在结构中添加一个化身 添加化身后,如何对结构进行编码,以使其成为多部分请求。 我在网上找到了一些解决方案,但不适用于我试图实现的场景 下面的代码是没有化身的请求的工作代码 struct User: Codable { let name: String let email: Stri

使用Swift 5,我试图减少很多依赖项(Alamofire),并且我试图理解在使用Codable和URLRequest时如何执行多部分请求

我的代码可以正确地创建一个有名字和电子邮件的用户,但是我需要在结构中添加一个化身

添加化身后,如何对结构进行编码,以使其成为多部分请求。 我在网上找到了一些解决方案,但不适用于我试图实现的场景

下面的代码是没有化身的请求的工作代码

struct User: Codable {
    let name: String
    let email: String?
}

UIImage
不符合
Codable
,但您可以对
pngData
表示进行编码。但是,这需要实现
Codable
方法

struct User: Codable {
    let name: String
    let email: String?
    var avatar : UIImage?

    private enum CodingKeys : String, CodingKey { case name, email, avatar }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        name = try container.decode(String.self, forKey: .name)
        email = try container.decodeIfPresent(String.self, forKey: .email)
        if let avatarData = try? container.decode(Data.self, forKey: .avatar) {
            avatar = UIImage(data: avatarData)
        }
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(name, forKey: .name)
        try container.encode(email, forKey: .email)
        if let avatarImage = avatar {
            try container.encode(avatarImage.pngData(), forKey: .avatar)
        }
    }
}
或者将
avatar
声明为URL并单独发送图像

struct User: Codable {
    let name: String
    let email: String?
    var avatar : UIImage?

    private enum CodingKeys : String, CodingKey { case name, email, avatar }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        name = try container.decode(String.self, forKey: .name)
        email = try container.decodeIfPresent(String.self, forKey: .email)
        if let avatarData = try? container.decode(Data.self, forKey: .avatar) {
            avatar = UIImage(data: avatarData)
        }
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(name, forKey: .name)
        try container.encode(email, forKey: .email)
        if let avatarImage = avatar {
            try container.encode(avatarImage.pngData(), forKey: .avatar)
        }
    }
}