ios - 如何从 Swift 中的 plist 读取多维字符串数组?

标签 ios swift multidimensional-array

我使用以下代码将 2D 字符串数组保存到 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

        }
    }

最佳答案

你做错了两件非常基本的事情。

  • 首先,永远不要通过 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")

关于ios - 如何从 Swift 中的 plist 读取多维字符串数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43702060/

相关文章:

C++多维数组多种数据类型

java - 将二维以上的java数组视为列表

ios - NSNotificationCenter 说明

ios - "Present Modally"当另一个模式已经出现时不显示

ios - 删除桥接头步骤

swift - 在AppKit应用程序中使用SpriteKit swift

java - 具有大量变异的矩阵的最佳数据结构

ios - Swift,无法读取url中的数据

javascript - Google Maps API 无法在 iPad 上加载

ios - 'Pods-App'目标具有传递依赖项,包括在快速框架中使用GTM时包括静态二进制文件的传递依赖项