gpt4 book ai didi

ios - 无法在Swift 5中将编码的json数据对象写入本地文件

转载 作者:行者123 更新时间:2023-12-01 21:59:11 25 4
gpt4 key购买 nike

我的Swift 5项目的根目录中有一个data.json文件,我想向其中写入一些数据。该文件已经预先装有数据,但是我想覆盖它。

这是我用来将Task结构数组编码为JSON数据的函数:

func encode(task: Task){
loadJSON()
t.append(task)
if let json = try? JSONEncoder().encode(t){
saveJSON(json: json)
}
}
loadJSON()将JSON数据从 t文件加载到 data.json数组中,然后将新的 Task附加到该数组中,然后使用 json数组中的编码数据创建 t常量,并调用 saveJSON函数。
func saveJSON(json: Data){
if let path = Bundle.main.path(forResource: "data", ofType: "json"){
let url = URL(fileURLWithPath: path)
do{
try json.write(to: url, options: .atomicWrite)
}
catch{
print(error)
}
}
}

设置路径和URL,然后执行 do,它不做任何事情就掉了。 data.json文件未更改,并且 json.write不会引发任何错误。

我不完全确定为什么我无法写入该文件。我试图写一个简单的字符串而不是一个数据集,结果相似。

最佳答案

该问题似乎是由于您尝试写入bundle目录而导致的,该目录无法直接写入(看来是从所有帐户开始)。将文件移动到可写目录(例如用户的文档目录)后,将允许您根据需要修改或删除文件。

您可以将资源文件复制到documents目录中,以便可以在本地访问它,也可以将其提供给用户。这是一个示例助手方法,该方法将从Bundle中复制文件(在您的情况下,将字符串data.json作为sourceFile参数传递)到documents目录中:

func copyFileFromBundleToDocumentsFolder(sourceFile: String, destinationFile: String = "") {
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first

if let documentsURL = documentsURL {
let sourceURL = Bundle.main.bundleURL.appendingPathComponent(sourceFile)

// Use the same filename if destination filename is not specified
let destURL = documentsURL.appendingPathComponent(!destinationFile.isEmpty ? destinationFile : sourceFile)

do {
try FileManager.default.removeItem(at: destURL)
print("Removed existing file at destination")
} catch (let error) {
print(error)
}

do {
try FileManager.default.copyItem(at: sourceURL, to: destURL)
print("\(sourceFile) was copied successfully.")
} catch (let error) {
print(error)
}
}
}

之后-如果您需要修改新创建的文件,则可以创建另一个函数,该函数使用几乎完全相同的逻辑用特定的json数据覆盖文件。

您可以修改loadJSON()和saveJSON()函数,以从该新文件读取或写入该新文件(在文档目录内部)。为了保存,如下所示:
func saveJSONDataToFile(json: Data, fileName: String) {
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first

if let documentsURL = documentsURL {
let fileURL = documentsURL.appendingPathComponent(fileName)

do {
try json.write(to: fileURL, options: .atomicWrite)
} catch {
print(error)
}
}
}

编辑:

对文档目录的更改应保留。这是用于检索该目录中所有文件列表的代码。检查有问题的文件是否可以正确持久保存应该有所帮助:
func listDocumentDirectoryFiles() {
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first

if let url = documentsURL {
do {
let contents = try FileManager.default.contentsOfDirectory(atPath: url.path)
print("\(contents.count) files inside the document directory:")
for file in contents {
print(file)
}
} catch {
print("Could not retrieve contents of the document directory.")
}
}
}

希望这可以帮助。如有疑问,请随时在评论中提问。祝好运!

关于ios - 无法在Swift 5中将编码的json数据对象写入本地文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60594363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com