我的结构不符合协议“可解码”/“可编码”

Joh*_*Tee 2 structure swift codable decodable

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

“ReminderGroups”类型不符合“Decodable”协议

“ReminderGroups”类型不符合“Encodable”协议

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

Yak*_* M. 10

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

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

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

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

reminderItem类型从更改UIImageData

从现在开始,当您需要访问图像时,请编写类似imageView.image = reminderGroup.reminderItem.image. 而当你需要保存的实例UIImagereminderItem,写类似reminderGroup.reminderItem = image.data!(哐运营商(惊叹号)是必要的,因为计算的属性data是可选的)。

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

  • 非常感谢您的解释,它解决了我的问题。我的结构中有一个不符合可编码原型的类型的数组。 (3认同)