Swift: 无法使用类型为“([Idea], from: Data)”的参数列表调用 'decode'
Swift: Cannot invoke 'decode' with an argument list of type '([Idea], from: Data)'
我一直在努力为我正在开发的应用找出数据持久化的最佳解决方案,我决定本地存储的 JSON 文件将是简单性和功能性的最佳平衡。
我需要保存的是一组自定义结构,我可以使用下面的代码编写它,但我无法将其解码回来,我收到此错误:
Cannot invoke 'decode' with an argument list of type '([Idea], from:
Data)'
知道是什么原因造成的吗? ideas 数组本身应该是 Codable 吗?编码它不应该工作,对吧?我是不是做错了什么?
如有任何建议,我们将不胜感激。
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)
}
}
你有两个问题。首先是编译器错误来自:
let readIdeas = try JSONDecoder().decode(ideas.self, from: jsonData)
需要:
let readIdeas = try JSONDecoder().decode([Idea].self, from: jsonData)
修复此问题后,您会收到运行时错误,因为您将文件写入 Documents 文件夹,但您试图从应用程序的资源包中读取它。
更新加载代码以使用与保存文件相同的路径:
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)
}
}
我一直在努力为我正在开发的应用找出数据持久化的最佳解决方案,我决定本地存储的 JSON 文件将是简单性和功能性的最佳平衡。
我需要保存的是一组自定义结构,我可以使用下面的代码编写它,但我无法将其解码回来,我收到此错误:
Cannot invoke 'decode' with an argument list of type '([Idea], from: Data)'
知道是什么原因造成的吗? ideas 数组本身应该是 Codable 吗?编码它不应该工作,对吧?我是不是做错了什么?
如有任何建议,我们将不胜感激。
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)
}
}
你有两个问题。首先是编译器错误来自:
let readIdeas = try JSONDecoder().decode(ideas.self, from: jsonData)
需要:
let readIdeas = try JSONDecoder().decode([Idea].self, from: jsonData)
修复此问题后,您会收到运行时错误,因为您将文件写入 Documents 文件夹,但您试图从应用程序的资源包中读取它。
更新加载代码以使用与保存文件相同的路径:
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)
}
}