代码之家  ›  专栏  ›  技术社区  ›  CristianMoisei

swift:无法使用类型为“([idea],from:data)”的参数列表调用“decode”

  •  0
  • CristianMoisei  · 技术社区  · 5 年前

    我一直在努力为我正在开发的应用程序寻找数据持久性的最佳解决方案,我决定本地存储的json文件将是简单性和功能性的最佳平衡。

    我需要保存的是一个自定义结构数组,我可以使用下面的代码很好地编写它,但是我无法将其解码回来,我得到了这个错误:

    无法使用类型为“([IDEA]的参数列表从以下位置调用“decode”: “数据”

    知道是什么原因吗?思想数组本身应该是可编码的吗?那编码就不该起作用了对吧?我还做错什么了吗?

    如有任何建议,将不胜感激。

    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 回复  |  直到 5 年前
        1
  •  1
  •   rmaddy    5 年前

    你有两个问题。首先是编译器错误:

    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)
        }
    }