繁体   English   中英

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写入应用程序的 bundle Documents文件夹。

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

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)
        ... 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM