我正在使用以下代码将2D String数组保存到plist:
func saveFavourites(favouriteStops: [[String]]) {
let directories = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true)
if let library = directories.first {
if let libraryUrl = URL(string: library) {
let favouritesUrl = libraryUrl.appendingPathComponent("favourites.plist")
// Write favourites to disk
let favsArray = favouriteStops as NSArray
print(favsArray)
favsArray.write(toFile: favouritesUrl.path, atomically: true)
}
}
}
上面的代码段正确创建.plist文件(通过查看~/Library/Developer/CoreServices
中的模拟器文件系统来确认)。但是,当我尝试使用以下代码段将其恢复为NSArray
时,会产生nil
:
let directories = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true)
if let library = directories.first {
if let libraryUrl = URL(string: library) {
let favouritesUrl = libraryUrl.appendingPathComponent("favourites.plist")
// favsToLoad is nil
let favsToLoad = NSArray(contentsOf: favouritesUrl)
// Do stuff with favsToLoad, if it would load properly
}
}
答案 0 :(得分:0)
你做了两件非常基本的事情。
首先,从不通过说URL(string)
来从文件路径创建URL;这是磁盘上的文件,因此您必须使用URL.fileURL
。
其次,根本不要以文件路径开头!从一开始就将目录作为URL获取。
(另外,虽然我不知道这是否是问题的根源,但不要直接在Library目录中读写。使用Documents目录,Application Support目录或类似目录。)
所以,例如,我会写:
let fm = FileManager.default
let docsurl = try fm.url(for:.documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
let favouritesurl = docsurl.appendingPathComponent("favourites.plist")
答案 1 :(得分:0)
我看到了你的问题。你拼错了“收藏夹”。 :)
但是认真地......
Plists只能包含一小组“属性列表对象”:(字典,数组,字符串,数字(整数和浮点数),日期,二进制数据和布尔值)。
如果数组的“对象图”(数组包含的对象以及数组中的任何容器对象递归包含)包含除上述类型之外的任何内容,则保存将失败。
我真的不知道失败后会得到什么。您是否尝试在文本编辑器中打开plist文件并查看它?
我的猜测是除了一个字符串以外的东西已经进入你的数组,它不是上述类型之一,这就是为什么它失败了。