Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在应用程序关闭时保存用户购物车?-敏捷的_Ios_Swift_Nscoding - Fatal编程技术网

Ios 如何在应用程序关闭时保存用户购物车?-敏捷的

Ios 如何在应用程序关闭时保存用户购物车?-敏捷的,ios,swift,nscoding,Ios,Swift,Nscoding,我想在应用程序关闭时保存当前用户购物车,这样用户就可以从相同的状态返回 我上过这门课: class CarrinhoItem: NSObject, NSCoding { let produto: Item var qtd: Double // MARK: - Init init(_ produto: Item, _ qtd: Double) { self.produto = produto self.qtd = qtd

我想在应用程序关闭时保存当前用户购物车,这样用户就可以从相同的状态返回

我上过这门课:

class CarrinhoItem: NSObject, NSCoding {
    let produto: Item
    var qtd: Double

    // MARK: - Init

    init(_ produto: Item, _ qtd: Double) {
        self.produto = produto
        self.qtd = qtd
    }

    // MARK: - NSCoding
    func encode(with aCoder: NSCoder) {
        aCoder.encode(produto, forKey: "produto")
        aCoder.encode(qtd, forKey: "qtd")
    }

    required init?(coder aDecoder: NSCoder) {
        produto = aDecoder.decodeObject(forKey: "produto") as! Item
        qtd = aDecoder.decodeDouble(forKey: "qtd")

    }
}
我使用这些函数返回并保存购物车:

class CarrinhoDao {

    func save(_ Carrinho: [CarrinhoItem]) {
        guard let caminho = recuperaCaminho() else { return }
        do {
            let dados = try NSKeyedArchiver.archivedData(withRootObject: Carrinho, requiringSecureCoding: false)
            try dados.write(to: caminho)
        } catch {
            print(error.localizedDescription)
        }
    }

    func recupera() -> [CarrinhoItem] {
        guard let caminho = recuperaCaminho() else { return [] }
        do {
            let dados = try Data(contentsOf: caminho)
            guard let CarrinhoSalvo = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(dados) as? Array<CarrinhoItem> else { return [] }
            return CarrinhoSalvo
        } catch {
            print(error.localizedDescription)
            return []
        }
    }

    func recuperaCaminho() -> URL? {
        guard let diretorio = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return nil }
        let caminho = diretorio.appendingPathComponent("refeicao")

        return caminho
    }
}
但我得到了一个错误:

unrecognized selector sent to instance 0x6000027f5780
The data couldn’t be written because it isn’t in the correct format.
编辑:

解决了为项目类添加nscoding的问题:

func encode(with aCoder: NSCoder) {
        aCoder.encode(nome, forKey: "nome")
        aCoder.encode(imagem, forKey: "imagem")
        aCoder.encode(preco, forKey: "preco")
        aCoder.encode(precoantes, forKey: "precoantes")
        aCoder.encode(tipo, forKey: "tipo")
        aCoder.encode(aval, forKey: "aval")
        aCoder.encode(avalcount, forKey: "avalcount")
        aCoder.encode(disponivel, forKey: "disponivel")
        aCoder.encode(descricao, forKey: "descricao")


    }

    required init?(coder aDecoder: NSCoder) {
        nome = aDecoder.decodeObject(forKey: "nome") as! String
        imagem = aDecoder.decodeObject(forKey: "imagem") as! String
        preco = aDecoder.decodeDouble(forKey: "preco")
        precoantes = aDecoder.decodeObject(forKey: "precoantes") as! String
        tipo = aDecoder.decodeObject(forKey: "tipo") as! String
        aval = aDecoder.decodeInteger(forKey: "aval")
        avalcount = aDecoder.decodeInteger(forKey: "avalcount")
        disponivel = aDecoder.decodeInteger(forKey: "disponivel")
        descricao = aDecoder.decodeObject(forKey: "descricao") as! String
    }

Item
是一个自定义类,因此您也必须为此类使用
NSCoding
协议

func encode(with aCoder: NSCoder) {
        aCoder.encode(nome, forKey: "nome")
        aCoder.encode(imagem, forKey: "imagem")
        aCoder.encode(preco, forKey: "preco")
        aCoder.encode(precoantes, forKey: "precoantes")
        aCoder.encode(tipo, forKey: "tipo")
        aCoder.encode(aval, forKey: "aval")
        aCoder.encode(avalcount, forKey: "avalcount")
        aCoder.encode(disponivel, forKey: "disponivel")
        aCoder.encode(descricao, forKey: "descricao")


    }

    required init?(coder aDecoder: NSCoder) {
        nome = aDecoder.decodeObject(forKey: "nome") as! String
        imagem = aDecoder.decodeObject(forKey: "imagem") as! String
        preco = aDecoder.decodeDouble(forKey: "preco")
        precoantes = aDecoder.decodeObject(forKey: "precoantes") as! String
        tipo = aDecoder.decodeObject(forKey: "tipo") as! String
        aval = aDecoder.decodeInteger(forKey: "aval")
        avalcount = aDecoder.decodeInteger(forKey: "avalcount")
        disponivel = aDecoder.decodeInteger(forKey: "disponivel")
        descricao = aDecoder.decodeObject(forKey: "descricao") as! String
    }