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