将嵌套字典写入 plist (Swift) 时的类型问题

Posted

技术标签:

【中文标题】将嵌套字典写入 plist (Swift) 时的类型问题【英文标题】:Type Issues When Writing a Nested dictionary to a plist (Swift) 【发布时间】:2016-08-08 21:22:04 【问题描述】:

我正在尝试编写具有多层嵌套的字典到 Swift 中的进度列表 (plist)。但是,由于某种原因,当我检查导致项目中出现一堆类型问题的 plist 时,其中一个字典被视为一个数组。

这是原始的嵌套字典:

我附上了一个显示 plist 结构的屏幕截图和另一个显示原始数据结构的屏幕截图,我知道您不是要显示代码照片,但是这个文本编辑器没有正确格式化它并且误用了尖括号

original data structure

screenshot showing plist

更新

好的,我在最顶层添加了一个键值对,并将其正确写入字典。我现在遇到的问题是我可以很好地写入 plist,但是当我尝试从中读取时,我得到的只是零。

func initializeProgress() 
let directories = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)

if let documents = directories.first 
    if let urlDocuments = NSURL(string: documents) 
        let urlProgress = urlDocuments.URLByAppendingPathComponent("progress.plist")
        let progressDict = NSDictionary(dictionary: ["AP Biology": ["Misc": ["correct": 0, "incorrect": 0, "totalInSection": 0, "percentDone": 0],
            "Basics": ["correct": 0, "incorrect": 0, "totalInSection": 0, "percentDone": 0],
            "Essential Chemistry": ["correct": 0, "incorrect": 0, "totalInSection": 0, "percentDone": 0],
            "Molecules of Life": ["correct": 0, "incorrect": 0, "totalInSection": 0, "percentDone": 0]]])
        progressDict.writeToFile(urlProgress.path!, atomically: true)

    


func retrieveAndSetProgress() 
let directories = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)

let documents = directories.first
let urlDocuments = NSURL(string: documents!)
let urlProgress = urlDocuments!.URLByAppendingPathComponent("progress.plist")
print(NSDictionary(contentsOfURL: urlProgress))
let data = NSData(contentsOfURL: urlProgress, options: NSDataReadingOptions())
    print(data)
progress = NSDictionary(contentsOfURL: urlProgress)! as! Dictionary<String, Dictionary<String, Dictionary<String, Int>>>


progress是全局变量,第二种方法的最后一行报错:fatal error: unexpectedly found nil while unwrapping an Optional value

【问题讨论】:

对我来说很好,把代码贴在你写/读 plist 的地方 我实际上能够通过在字典的最顶层添加另一个键值对来使其正常工作。我现在遇到的问题是,当我尝试将它读回我的项目时,它是 nil 吗?我将立即发布读/写代码。感谢您的帮助。 @dan 我已经更新了问题并添加了我用来读写的两种方法,感谢您的帮助 【参考方案1】:

改变

print(NSDictionary(contentsOfURL: urlProgress))

print(NSDictionary(contentsOfFile: urlProgress.absoluteString))

它可以读取它。我刚刚在操场上测试过

【讨论】:

以上是关于将嵌套字典写入 plist (Swift) 时的类型问题的主要内容,如果未能解决你的问题,请参考以下文章

writeToFile 输出 .plist 没有写入正确的值

如何将这些数据写入我的 Plist? - 斯威夫特

swift - 从嵌套字典中删除或替换 <null> 值

Swift 3:无法将数据写入 plist 文件

如何使用 Swift 将新数组数据添加到 plist 文件中的 NSDictionary

替换嵌套 NSDictionary 中出现的 NSNull