1
resposta

Erro ao usar NSKeyedUnarchiver.unarchiveObject deprecado

Toda vez que rodo esse codigo crasha na linha do if let loaded, XCode 10.2.1 (10E1001) Swift 4, sem suporte ao swift 3

override func viewDidLoad() {
        let userDir = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
        let dir = userDir[0]
        if let loaded = NSKeyedUnarchiver.unarchiveObject(withFile: "\(dir)/meals.dados") {
            self.meals = loaded as! Array<Meal>
        }
    }
1 resposta

Oi Giuliano, tudo bem?

Anualmente o Swift sofre alterações, e uma delas foi com o KeyedArchiver e o KeyedUnarchiver

Segue um exemplo para salvar objetos:

func saveProducts() {
        do {
            guard let mainPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
            let path = mainPath.appendingPathComponent("products")
            do {
                let data = try NSKeyedArchiver.archivedData(withRootObject: productList, requiringSecureCoding: false)
                try data.write(to: path)
            }
            catch {
                print(error.localizedDescription)
            }
        }
    }

Nesse exemplo, o que se difere da aula, é que transformamos o array em data e depois chamamos o método write.

Para recuperar:

func getProducts() {
        guard let mainPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
        let path = mainPath.appendingPathComponent("products")

        do {
            let data = try Data(contentsOf: path)

            if let productList = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? [Product] {
                // Aqui utilizamos a lista de produtos
            }
        } catch {
            print(error.localizedDescription)
        }
    }

Primeiro, recuperamos o arquivo do tipo data salvo anteriormente (baseado no caminho que criamos). Com o arquivo em mãos, podemos chamar o método NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) e fazer o casting para o tipo de objeto.

Testa aí qualquer dúvida me avisa.

Abs.