如何将数组写入plist文件?

3
我想将一个数组写入 .plist 文件,但在调用函数后 .plist 文件中没有任何内容。
这是我的代码:
override func viewDidLoad() {
        super.viewDidLoad()
        var filepath = NSHomeDirectory().stringByAppendingString("/lacator.plist")
        let array:NSArray = ["b","a","n","d"]
        array.writeToFile(filepath, atomically: true)

}

文件已放置:

/var/mobile/Containers/Data/Application/AE38143E-C398-4DA7-952D-4E1C903E9637/locator.plist

但我找不到那个文件夹...


2
我已经在iOS模拟器上尝试了你的代码,对我来说运行得很好。你有尝试过记录filepath吗?可能它将文件存储在你意料之外的地方。 - Igor B.
在我的情况下,该文件位于这里:/Users/melifaro/Library/Developer/CoreSimulator/Devices/525924EE-1C43-4341-A3BC-EF42224DB268/data/Containers/Data/Application/A4BD9D82-7AD5-488F-BF73-541DEB5FB007/lacator.plist - Igor B.
1
在iOS中,你不能写入主目录,而是要写入文档目录。 - dan
@kennytm,我想在我的电脑中找到“locator.plist”文件,但是失败了。 - Yuri
@kennytm 我该怎么做才能在手机上运行应用程序时将数据存储在计算机中? - Yuri
显示剩余3条评论
3个回答

4

正如@dan所提到的,您不能写入主目录,考虑写入文档文件夹:

    func applicationDocumentsDirectory() -> String {
        let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
        let basePath = paths.first ?? ""
        return basePath
    }

    let filepath = applicationDocumentsDirectory().stringByAppendingString("/lacator.plist")
    let array:NSArray = ["b","a","n","d"]
    array.writeToFile(filepath, atomically: true)

    print("Does file exist: \(NSFileManager.defaultManager().fileExistsAtPath(filepath)) at path: \(filepath)")

输出

    Does file exist: true at path: /var/mobile/Applications/2754A65C-DF1B-4B69-9FC5-A3A171D88087/Documents/lacator.plist

如果您在iTunes中启用了“文档”文件夹访问权限,则可以从iTunes获取此文件:

我的应用程序中的iTunes文档目录


@Yuri,欢迎!如果这有帮助,请投票并接受 :) - Igor B.

0

和 @lgor B. 的答案一样,只不过是使用 swift 5

struct JSONManager {

    private static var applicationDocumentsDirectory: String? {
        let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
        return paths.first
    }

    private static var mockDataPath: String? {
        guard let basePath = JSONManager.applicationDocumentsDirectory else {
            return .none
        }
        return basePath.appendingFormat("/yourPlistName.plist")
    }

    static func save(_ array: NSArray) {

        guard let path = mockDataPath else { return }
        array.write(toFile: path, atomically: true)

        assert(FileManager.default.fileExists(atPath: path))
    }

}

如果您也想阅读它,请将这两种方法添加到JSONManager中:

    static func readArray() -> NSArray? {
        guard let path = mockDataPath else { return .none }
        return NSArray(contentsOfFile: path)
    }

    static func readDicionary() -> NSDictionary? {
        guard let path = mockDataPath else { return .none }
        return NSDictionary(contentsOfFile: path)
    }

0

现在(自2016年Swift 3发布以来)强烈建议使用PropertyListSerializationFilemanager的URL相关API。

首先创建一个计算变量,它返回当前文档目录的URL。

var documentsDirectoryURL : URL {
    return try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
}

强制解包的URL是安全的,因为文档目录已经存在。


使用PropertyListSerialization对数组进行序列化,并将数据写入URL。

let fileURL = documentsDirectoryURL.appendingPathComponent("lacator.plist")
let array = ["b","a","n","d"]
do {
    let data = try PropertyListSerialization.data(fromPropertyList: array, format: .binary, options: 0)
    try data.write(to: fileURL)
} catch {
    print(error)
}

如果类型符合Encodable,则在Swift 4+中使用PropertyListEncoder更加方便

do {
    let data = try PropertyListEncoder().encode(array)
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接