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

时间:2018-11-11 18:49:25

标签: swift structure codable decodable

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

  

类型“ ReminderGroups”不符合协议“可解码”

  

类型'ReminderGroups'不符合协议'Encodable'

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

1 个答案:

答案 0 :(得分:0)

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

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

我将为您显示第一个选项。我想您不想每次都写这些if let,所以让我们在extensionUIImage上添加两个小的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。您没有提供该类型的声明,所以我不能说它是否符合。