Bundle.main.url 无法找到使用 PropertyListSerialization 保存的 plist



我正在读取和写入plist,但两个进程之一不起作用。

读数

var data: [String: Int] = [:]
if let url = Bundle.main.url(forResource: "Calendar", withExtension: "plist") {
do {
print("url: (url)")
let dataContent = try Data(contentsOf: url)
if let dict = try PropertyListSerialization.propertyList(from: dataContent, format: nil) as? [String: Int] {
data = dict
}
} catch {
print(error)
}
}

此处url未打印,这意味着Bundle.main.url无法找到Calendar.plist或未正确保存。

写作

do {
let path = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("Calendar.plist")
let plistData = try PropertyListSerialization.data(fromPropertyList: data, format: .xml, options: 0)
try plistData.write(to: path)
} catch {
print(error)
}

data是试探性的["test": 1]

以下是您正在做的事情:

  • 阅读时,您可以从应用程序的捆绑包根文件夹中读取Calendar.plist
  • 编写时,将Calendar.plist写入应用程序的捆绑包Documents文件夹中。

由于应用程序的捆绑根文件夹(从您正在阅读的位置)对您来说是不可写的,因此您的Calendar.plist的正确位置是Documents文件夹,您应该以与编写时相同的方式为其创建 URL 或路径,最好在从读取和写入例程调用的专用 getter 中。

func calendarURL() -> URL? {
guard let result = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("Calendar.plist") else { return nil }
return result
}

读数

var data: [String: Int] = [:]
if let url = calendarURL() {
...

写作

if let path = calendarURL() {
do {
let plistData = try PropertyListSerialization.data(fromPropertyList: data, format: .xml, options: 0)
... 

相关内容

  • 没有找到相关文章

最新更新