【发布时间】:2019-07-03 23:28:11
【问题描述】:
我一直在尝试为我正在开发的应用程序找出最佳的数据持久性解决方案,我认为本地存储的 JSON 文件将是简单性和功能性的最佳平衡。
我需要保存的是一组自定义结构,我可以使用下面的代码很好地编写它,但是我无法将其解码回来,我收到了这个错误:
无法使用类型为 '([Idea], 的参数列表来自: 数据)'
知道是什么原因造成的吗?想法数组本身是否应该是可编码的?编码它不应该工作,对吧?我做错了什么吗?
任何建议将不胜感激。
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)
}
}
【问题讨论】:
-
试试
[Idea].self而不是ideas.self。 -
感谢@rmaddy,但这会导致崩溃,仅显示“在展开可选值时意外发现 nil”而没有其他详细信息。
-
那是因为它修复了编译器错误,现在你得到一个完全不相关的运行时错误。
jsonData很可能是 nil,因为您的文件实际上不在应用程序的资源包中。这是有道理的,因为您将文件写入了 Documents 文件夹。两个完全不同的地方。 -
使用与保存时相同的代码获取路径。
-
详情见我的回答。
标签: json swift persistence jsondecoder swift-structs