Моя структура не соответствует протоколу «Декодируемый» / «Кодируемый» - PullRequest
0 голосов
/ 11 ноября 2018

Я пытался использовать Codable для сохранения своих данных из создаваемого приложения, но когда я помещаю Codable в свою структуру, я получаю сообщение об ошибке:

Тип 'ReminderGroups' не соответствует протоколу 'Decodable'

и

Тип 'ReminderGroups' не соответствует протоколу 'Encodable'

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

1 Ответ

0 голосов
/ 11 ноября 2018

Чтобы класс или структура соответствовали протоколу, все свойства этого класса или структуры должны соответствовать одному и тому же протоколу.

UIImage не соответствует Codable, поэтому любой класс или структура, имеющие свойства типа UIImage, также не будут соответствовать. Вы можете заменить изображение данными изображения или представлением изображения base64 (как String).

Я покажу вам первый вариант. Я полагаю, что вы не хотите писать эти if let каждый раз, поэтому давайте добавим два маленьких extension к UIImage и Data, которые ускорят будущие преобразования.

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 является необязательным).

Также убедитесь, что ReminderItem соответствует Codable. Вы не предоставили объявление такого типа, поэтому я не могу сказать, соответствует ли оно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...