Swift 3:无法将数据写入 plist 文件
Posted
技术标签:
【中文标题】Swift 3:无法将数据写入 plist 文件【英文标题】:Swift 3: cannot write data to plist file 【发布时间】:2017-03-11 14:13:34 【问题描述】:我正在尝试使用一个名为 Data.plist 的文件来存储一些简单的非结构化数据,并将该文件放在我的应用程序的根文件夹中。为了使读取/写入此文件变得简单,我创建了以下 DataManager 结构。它可以毫无问题地读取 Data.plist 文件,但不能将数据写入文件。我不确定问题出在哪里,有人能发现哪里可能出错了吗?
struct DataManager
static var shared = DataManager()
var dataFilePath: String?
return Bundle.main.path(forResource: "Data", ofType: "plist")
var dict: NSMutableDictionary?
guard let filePath = self.dataFilePath else return nil
return NSMutableDictionary(contentsOfFile: filePath)
let fileManager = FileManager.default
fileprivate init()
guard let path = dataFilePath else return
guard fileManager.fileExists(atPath: path) else
fileManager.createFile(atPath: path, contents: nil, attributes: nil) // create the file
print("created Data.plist file successfully")
return
func save(_ value: Any, for key: String) -> Bool
guard let dict = dict else return false
dict.setObject(value, forKey: key as NSCopying)
dict.write(toFile: dataFilePath!, atomically: true)
// confirm
let resultDict = NSMutableDictionary(contentsOfFile: dataFilePath!)
print("saving, dict: \(resultDict)") // I can see this is working
return true
func delete(key: String) -> Bool
guard let dict = dict else return false
dict.removeObject(forKey: key)
return true
func retrieve(for key: String) -> Any?
guard let dict = dict else return false
return dict.object(forKey: key)
【问题讨论】:
【参考方案1】:您无法修改应用程序包中的文件。因此,您使用Bundle.main.path(forResource:ofType:)
获得的所有文件都是可读但不可写的。
如果您想修改此文件,您需要先将其复制到应用的文档目录中。
let initialFileURL = URL(fileURLWithPath: Bundle.main.path(forResource: "Data", ofType: "plist")!)
let documentDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last!
let writableFileURL = documentDirectoryURL.appendingPathComponent("Data.plist", isDirectory: false)
do
try FileManager.default.copyItem(at: initialFileURL, to: writableFileURL)
catch
print("Copying file failed with error : \(error)")
// You can modify the file at writableFileURL
【讨论】:
谢谢,它现在可以在文档目录中使用。我只是个笨蛋! :D以上是关于Swift 3:无法将数据写入 plist 文件的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Swift 4 将数据写入 Firebase 实时数据库