我的结构不符合协议 'Decodable' / 'Encodable'

My structure does not conform to protocol 'Decodable' / 'Encodable'

我试图使用 Codable 来保存我正在创建的应用程序中的数据,但是当我将 Codable 放入我的结构中时,我不断收到错误消息:

Type 'ReminderGroups' does not conform to protocol 'Decodable'

Type 'ReminderGroups' does not conform to protocol 'Encodable'

struct ReminderGroups: Codable {
    var contentsArray: [ReminderItem] = []
    var reminderName: String = ""
    var reminderItem: UIImage = #imageLiteral(resourceName: "Folder")
}

为了使 class 或结构符合协议,该 class 或结构的所有属性必须符合同一协议。

UIImage 不符合 Codable,因此任何 class 或具有类型 UIImage 属性的结构也不符合。您可以将图像替换为图像数据或图像的 base64 表示形式(如 String)。

我会告诉你第一个选项。我想你不想每次都写那些 if lets,所以让我们在 UIImageData 中添加两个小的 extensions 来加速未来的转换。

extension UIImage {
    var data: Data? {
        if let data = self.jpegData(compressionQuality: 1.0) {
            return data
        } else {
            return nil
        }
    }
}

extension Data {
    var image: UIImage? {
        if let image = UIImage(data: self) {
            return image
        } else {
            return nil
        }
    }
}

reminderItem 的类型从 UIImage 更改为 Data

从现在开始,当你需要访问图像时,写类似imageView.image = reminderGroup.reminderItem.image的东西。当您需要将 UIImage 的实例保存到 reminderItem 时,请编写类似 reminderGroup.reminderItem = image.data! 的内容(需要 bang 运算符(感叹号),因为计算的 属性 data 是可选的)。

还要确保 ReminderItem 确实符合 Codable。你没有提供那个类型的声明,所以我不能说是否符合。