Bundle.main.url не может найти список, сохраненный с помощью PropertyListSerialization - PullRequest
0 голосов
/ 05 августа 2020

Я читаю и пишу в 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] ориентировочно.

1 Ответ

1 голос
/ 05 августа 2020

Вот что вы делаете:

  • при чтении вы читаете свой Calendar.plist из папки пакета root приложения.
  • при записи вы пишете свой Calendar.plist в папку пакета Documents приложения.

Поскольку папка пакета root приложения (из того места, где вы читаете) не доступна для записи, правильное расположение для вашего 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)
        ... 
...