![](/img/trans.png)
[英]My structure does not conform to protocol 'Decodable' / 'Encodable' if I use protocol type in my structure in swift
[英]My structure does not conform to protocol 'Decodable' / 'Encodable'
我试图使用Codable从正在创建的应用程序中保存数据,但是当我将Codable放入我的结构中时,却不断出现错误:
类型“ ReminderGroups”不符合协议“ Decodable”
和
类型“ ReminderGroups”不符合协议“ Encodable”
struct ReminderGroups: Codable {
var contentsArray: [ReminderItem] = []
var reminderName: String = ""
var reminderItem: UIImage = #imageLiteral(resourceName: "Folder")
}
为了使类或结构符合协议,该类或结构的所有属性必须符合相同的协议。
UIImage
不符合Codable
,因此具有UIImage
类型的属性的任何类或结构也不符合。 您可以将图像替换为图像数据或图像的base64表示形式(如String
)。
我会告诉你第一个选择。 我想您不想每次都写if let
,所以让我们在UIImage
和Data
中添加两个小extension
可以加速未来的转换。
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!
(因为计算的属性data
是可选的,所以需要bang运算符(感叹号)。
还要确保ReminderItem
确实符合Codable
。 您没有提供该类型的声明,所以我不能说它是否符合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.