Bundle.main.url 无法找到使用 PropertyListSerialization 保存的 plist
Bundle.main.url is unable to locate plist saved with PropertyListSerialization
我正在读取和写入 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)
...
我正在读取和写入 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)
...