簡體   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