как кодировать и декодировать enum на swift 4.2? - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь создать модель для моего приложения, имеющую переменную String и 2 UIImage и enum.с моим кодом приложение вылетает, когда я пытаюсь добавить какой-то элемент.не могли бы вы мне помочь, пожалуйста?Я ищу некоторые решения, но ничего не нашел.до этого кода я использовал NScoding, но теперь у меня должен быть кодируемый для класса UIdocument

import UIKit

class BollettaModel: NSObject, Codable {

    enum Bolletta: String {
        case elettricita
        case gas
        case acqua
        case telefono
        case payTV
        case bill
    }

    var tipo : Bolletta
    var costo : String
    var data : Date
    var immagineBolletta : UIImage
    var immagineRicevuta : UIImage

    enum CodingKeys: String, CodingKey {
        case tipo
        case costo
        case data
        case immagineBolletta
        case immagineRicevuta
    }

    required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.tipo = try Bolletta(rawValue: container.decode(String.self, forKey: .tipo)) ?? .elettricita
        self.costo = try container.decode(String.self, forKey: .costo)
        self.data = try container.decode(Date.self, forKey: .data)
        let strBase64 = try container.decode(String.self, forKey: .immagineBolletta)
        let dataDecoded = Data(base64Encoded: strBase64,
                               options: .ignoreUnknownCharacters)!
        if let imma = UIImage(data: dataDecoded) {
            immagineBolletta = imma
        } else { immagineBolletta = UIImage() }
        let strBase641 = try container.decode(String.self, forKey: .immagineRicevuta)
        let dataDecoded1 = Data(base64Encoded: strBase641,
                               options: .ignoreUnknownCharacters)!
        if let imma = UIImage(data: dataDecoded1) {
            immagineRicevuta = imma
        } else { immagineRicevuta = UIImage() }
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(self.tipo.rawValue, forKey: .tipo)
        try container.encode(costo, forKey: .costo)
        try container.encode(data, forKey: .data)
        if let imageData = immagineBolletta.pngData() {
            let strBase64 = imageData.base64EncodedString(options: .lineLength64Characters)
            try container.encode(strBase64, forKey: .immagineBolletta)
        }
        if let imageData = immagineRicevuta.pngData() {
            let strBase64 = imageData.base64EncodedString(options: .lineLength64Characters)
            try container.encode(strBase64, forKey: .immagineRicevuta)
        }
    }

    init(tipo: Bolletta, costo: String, data: Date, immagineBolletta: UIImage, immagineRicevuta: UIImage) {
        self.tipo = tipo
        self.costo = costo
        self.data = data
        self.immagineBolletta = immagineBolletta
        self.immagineRicevuta = immagineRicevuta
    }
}
...