如何从Swift中的plist中读取多维String数组?

时间:2017-04-30 01:31:01

标签: ios swift multidimensional-array

我正在使用以下代码将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

        }
    }

2 个答案:

答案 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文件并查看它?

我的猜测是除了一个字符串以外的东西已经进入你的数组,它不是上述类型之一,这就是为什么它失败了。