在NSUserDefault中保存自定义类时出错

时间:2017-06-11 09:33:00

标签: ios swift nsuserdefaults

我制作一个必须在NSUserDefault中保存的自定义项目的简单列表

     import UIKit

    @objc(Oggetto_ordinabile)
    class Oggetto_ordinabile: NSObject,NSCoding {

        var Nome_ita = ""
        var numero:Int = 0
        var Nome_internazionale = ""
        var Immagine:UIImage = #imageLiteral(resourceName: "new_drink_placeholder")
        var Descrizione_ita = ""
        var Descrizione_internazionale = ""
        var Prezzo:Double = 0.0


        required convenience init(coder decoder: NSCoder) {
            self.init()

            self.Nome_ita = decoder.decodeObject(forKey: "Nome_ita") as! String
            self.Nome_internazionale = decoder.decodeObject(forKey: "Nome_internazionale") as! String
            self.Immagine = decoder.decodeObject(forKey: "Immagine") as! UIImage
            self.Descrizione_ita = decoder.decodeObject(forKey: "Descrizione_ita") as! String
            self.Descrizione_internazionale = decoder.decodeObject(forKey: "Descrizione_internazionale") as! String
            self.Prezzo = decoder.decodeObject(forKey: "Prezzo") as! Double
        }


        func encode(with coder: NSCoder)  {
            coder.encode(Nome_ita, forKey: "Nome_ita")
            coder.encode(Nome_internazionale, forKey: "Nome_internazionale")
            coder.encode(Immagine, forKey: "Immagine")
            coder.encode(Descrizione_ita, forKey: "Descrizione_ita")
            coder.encode(Descrizione_internazionale, forKey: "Descrizione_internazionale")
            coder.encode(Prezzo, forKey: "Prezzo")
        }
    }

然后我有一个方法来决定信息是否可用并从内存中加载它们

private func ScaricaInformazioni(Cosa_scaricare:String){


            if let dati = ValoriDefault.data(forKey: Cosa_scaricare),
                let ArrayArticoli = NSKeyedUnarchiver.unarchiveObject(with: dati) as? [Oggetto_ordinabile]
                {
                 print("Info disp")
                self.CosaVisualizzare = ArrayArticoli
                self.Collection_view.reloadData()

            }

            else{// ancora non sono stati creati i dati
                print("Info non disp")
                switch Cosa_scaricare {

                case "Stuzzichini":
                    CreaStuzzichiniDefault()
                    ScaricaInformazioni(Cosa_scaricare: Cosa_scaricare)
                    break

                case "Bevande":
                    CreaBevandeDefault()
                    ScaricaInformazioni(Cosa_scaricare: Cosa_scaricare)
                    break

                case "Narghilè":
                    CreaNarghileDefault()
                    ScaricaInformazioni(Cosa_scaricare: Cosa_scaricare)
                    break

                default:
                    break
                }
            }

        }

如果不是这样的话:

let BlackRussian = Oggetto_ordinabile()
    BlackRussian.Nome_ita = "Black Russian"
    BlackRussian.Nome_internazionale = "Black Russian"
    BlackRussian.numero = 9
    BlackRussian.Descrizione_internazionale = "Vodka,Kaula"
    BlackRussian.Descrizione_ita = "Vodka,Kaula"

    let PinaColada = Oggetto_ordinabile()
    PinaColada.Nome_internazionale = "Piña Colanda"
    PinaColada.Nome_ita = "Piña Colanda"
    PinaColada.numero = 10
    PinaColada.Descrizione_ita = "Rum Bianco, Succo d'Ananas, Sciroppo di Cocco"
    PinaColada.Descrizione_internazionale = "White Rum, Pineapple Juice, Coconout Sirup"

    var Drink = [Oggetto_ordinabile]()

    Drink.append(Capirina)
    Drink.append(JapaneseSliper)
    Drink.append(Kir)
    Drink.append(ScrewDriver)
    Drink.append(AcquaMarina)
    Drink.append(TurquoiseBlue)
    Drink.append(FrenchKiss)
    Drink.append(LongIsland)
    Drink.append(BlackRussian)
    Drink.append(PinaColada)

    let datiCodificati = NSKeyedArchiver.archivedData(withRootObject: Drink)
    ValoriDefault.set(datiCodificati, forKey: "Bevande")

    return

我得到"致命错误:在打开一个可选值"时意外地发现了nil;随便在init init方法中,为什么?

0 个答案:

没有答案