我试图使用Codable从正在创建的应用程序中保存数据,但是当我将Codable放入我的结构时,我不断收到错误消息:
类型“ ReminderGroups”不符合协议“可解码”
和
类型'ReminderGroups'不符合协议'Encodable'
struct ReminderGroups: Codable {
var contentsArray: [ReminderItem] = []
var reminderName: String = ""
var reminderItem: UIImage = #imageLiteral(resourceName: "Folder")
}
答案 0 :(得分:0)
为了使类或结构符合协议,该类或结构的所有属性必须符合相同的协议。
UIImage
不符合Codable
,因此具有类型UIImage
类型的属性的任何类或结构也不符合。您可以将图像替换为图像数据或图像的base64表示形式(如String
)。
我将为您显示第一个选项。我想您不想每次都写这些if let
,所以让我们在extension
和UIImage
上添加两个小的Data
可以加快未来的转换。 / p>
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
。您没有提供该类型的声明,所以我不能说它是否符合。