Чтение файла PLIST Dict of Dict - PullRequest
2 голосов
/ 12 марта 2020

Я пытаюсь прочитать файл plist, который имеет Dictionary внутри Dictionary

Пример: ["Name":["Age":"Two", "Height":"Short"]]

Вот как я читаю файл:

do {
    let data = try Data(contentsOf: URL(fileURLWithPath: path))
    let dataFromPlist = try PropertyListSerialization.propertyList(from: data, format: nil) as! [String:Any]
    print(dataFromPlist)
    } catch {
      print(error)
    }

Но мой результат print(dataFromPlist) возвращает следующее:

["Name": {
Age = 1;
Height = 1;
}]

Как либо преобразовать результат моего текущего метода чтения, либо прочитать файл .plist, чтобы я точно вернулся что я сохранил в нем:

["Name":["Age":"Two", "Height":"Short"]]

1 Ответ

1 голос
/ 12 марта 2020

Попробуйте установить формат словаря в явном виде, если вы работаете только с вложенным словарем, имеющим тип [String: String] :

let dataFromPlist = try PropertyListSerialization.propertyList(from: data, format: nil) as! [String : [String : String ] ]

На основе данных примера , Я создал список свойств, исходный файл которого преобразуется в этот файл в xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Name</key>
    <dict>
        <key>Age</key>
        <string>Two</string>
        <key>Height</key>
        <string>Short</string>
    </dict>
</dict>
</plist>

Вывод выглядит так, как вам бы хотелось:

["Name": ["Height": "Short", "Age": "Two"]]

Полный пример кода с примером Файл .plist в root проекта:

let urlPath = Bundle.main.url(forResource: "Example", withExtension: "plist")
    if let urlPath = urlPath {
        do {
            let data = try Data(contentsOf: urlPath)
            let dataFromPlist = try PropertyListSerialization.propertyList(from: data, format: nil) as! [String : [String : String ] ]
            print(dataFromPlist)
        } catch {
            print(error)
        }
    }
}
...