我的结构不符合协议 '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 let
s,所以让我们在 UIImage
和 Data
中添加两个小的 extension
s 来加速未来的转换。
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
。你没有提供那个类型的声明,所以我不能说是否符合。
我试图使用 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 let
s,所以让我们在 UIImage
和 Data
中添加两个小的 extension
s 来加速未来的转换。
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
。你没有提供那个类型的声明,所以我不能说是否符合。