Swift: невозможно вызвать 'decode' со списком аргументов типа '([Idea], from: Data)' - PullRequest
1 голос
/ 04 июля 2019

Я пытался найти лучшее решение для сохранения данных для приложения, над которым я работаю, и я решил, что локально сохраненный файл JSON будет лучшим балансом простоты и функциональности.

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

Невозможно вызвать 'decode' со списком аргументов типа '([Idea], from: Данные) '

Есть идеи, что это вызывает? Должен ли сам массив идей быть кодируемым? Кодирование не должно сработать, верно? Я делаю что-то еще не так?

Любые предложения будут оценены.

var ideas = [Idea]()

-

struct Idea: Codable {
    var title: String
    var description: String?
    var date: String
    var completed: Bool
}

-

func writeIdeasToJSON(){
    let pathDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    try? FileManager().createDirectory(at: pathDirectory, withIntermediateDirectories: true)
    let filePath = pathDirectory.appendingPathComponent("data.json")

    let json = try? JSONEncoder().encode(ideas)

    do {
        try json!.write(to: filePath)
    } catch {
        print("Failed to write JSON data: \(error.localizedDescription)")
    }
}

-

func readIdeasFromJSON(){
    do {
        let path = Bundle.main.path(forResource: "data", ofType: "json")
        let jsonData = try Data(contentsOf: URL(fileURLWithPath: path!))

        do {
            let readIdeas = try JSONDecoder().decode(ideas.self, from: jsonData)
            print(readIdeas)
        } catch let error{
            print(error.localizedDescription)
        }
    } catch let error {
        print(error.localizedDescription)
    }
}

1 Ответ

1 голос
/ 04 июля 2019

У вас есть две проблемы. Сначала ошибка компилятора из:

let readIdeas = try JSONDecoder().decode(ideas.self, from: jsonData)

Это должно быть:

let readIdeas = try JSONDecoder().decode([Idea].self, from: jsonData)

Исправив это, вы получите ошибку времени выполнения, поскольку вы записали файл в папку «Документы», но пытаетесь прочитать его из пакета ресурсов приложения.

Обновите код загрузки, чтобы использовать тот же путь, который использовался для сохранения файла:

func readIdeasFromJSON(){
    do {
        let pathDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
        let filePath = pathDirectory.appendingPathComponent("data.json")

        let jsonData = try Data(contentsOf: filePath)
        let readIdeas = try JSONDecoder().decode([Idea].self, from: jsonData)
        print(readIdeas)
    } catch {
        print(error)
    }
}
...