Swift - 如何使这个结构符合 Codable?

Posted

技术标签:

【中文标题】Swift - 如何使这个结构符合 Codable?【英文标题】:Swift - How to conform this struct to Codable? 【发布时间】:2020-02-13 13:51:03 【问题描述】:

我有这个结构

struct Photo: Codable 
    var image: UIImage
    let caption: String?
    let location: CLLocationCoordinate2D?


private enum CodingKeys: String, CodingKey 
    case image = "image"
    case caption = "caption"
    case location = "location"

我收到这 2 个错误:

类型“照片”不符合协议“可解码”

类型“照片”不符合协议“可编码”

【问题讨论】:

UIImage 应该是 Codable,但它不是。 CLLocationCoordinate2D 也必须是 Codable。另外CodingKeys 必须是Photo 的内部成员。在这种情况下,根本不需要它们。您最好的选择是通过转换为 Data (png/jpeg) 并可能转换为 StringUIImage 进行自定义编码/解码。 【参考方案1】:

'Photo' 不符合协议 Encodable/Decodable 因为 UIImage 不能符合 Codable。 CLLocationCoordinate2D 也不能符合 Codable。 你可以用Data类型指定var image,然后从Data获取UIImage。

类似这样的:

struct Photo: Codable 
    var imageData: Data
    let caption: String?
    let location: String?

    func getImage(from data: Data) -> UIImage? 
        return UIImage(data: data)
    


private enum CodingKeys: String, CodingKey 
    case imageData = "image"
    case caption = "caption"
    case location = "location"

【讨论】:

请注意,将图像数据作为 JSON 字符串发送会非常慢,而且它的大小也会大大增加。我只会对图像 URL 进行编码。关于位置,创建一个位置结构会更好。 struct Location: Codable let latitude, longitude: Double

以上是关于Swift - 如何使这个结构符合 Codable?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 4 Codable 中手动解码数组?

如何使用 Swift 的 Codable 编码成字典?

如何在目标 c 数据模型类中使用 Codable 协议?

如何使用 Codable 和 Swift 解析这个嵌套的 JSON?

如何从 Swift Codable 中排除属性?

Swift 使用Codable协议进行json转模型