繁体   English   中英

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

[英]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 ,所以让我们在UIImageData中添加两个小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的类型从UIImageData

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM