在 Swift 中写入 Plist
Posted
技术标签:
【中文标题】在 Swift 中写入 Plist【英文标题】:Write to Plist in Swift 【发布时间】:2021-03-06 13:55:14 【问题描述】:我正在尝试在 xcode 中写入 plist。我写的作品,除了 plist 文件没有改变。我已经尝试了几种不同的实现,并达到了相同的结果。
代码如下:
func saveGameData()
let BedroomFloorKey = "BedroomFloor"
let BedroomWallKey = "BedroomWall"
var bedroomFloorID: AnyObject = 101 as AnyObject
var bedroomWallID: AnyObject = 101 as AnyObject
let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) as NSArray
let documentsDirectory = paths.object(at: 0) as! NSString
let path = documentsDirectory.appendingPathComponent("room.plist")
print("PATH", path)
let dict: NSMutableDictionary = ["XInitializerItem": "DoNotEverChangeMe"]
//saving values
dict.setObject(bedroomFloorID, forKey: BedroomFloorKey as NSCopying)
dict.setObject(bedroomWallID, forKey: BedroomWallKey as NSCopying)
//...
//writing to GameData.plist
dict.write(toFile: path, atomically: false)
let resultDictionary = NSMutableDictionary(contentsOfFile: path)
print("Saved GameData.plist file is --> \(resultDictionary?.description ?? "")")
我的 plist 位于我的 xcode 项目的主目录中,与 ViewController 所在的文件夹相同。
谢谢
【问题讨论】:
“我写的东西有效,除了 plist 文件没有改变。” 那么它究竟是如何“工作”的呢?print("PATH", path)
行是否打印出您期望的内容?
【参考方案1】:
您无法写入应用程序包,原因很明显,该包是只读的。
您的代码将 plist 写入应用程序容器中的 Documents
目录。如果应用程序包中有默认属性列表文件,请在应用程序首次启动时将其复制到 Documents 目录中。
然而,代码看起来像是对 Objective-C 代码的丑陋直译。这是原生 Swift 版本
func saveGameData() throws
let bedroomFloorKey = "BedroomFloor"
let bedroomWallKey = "BedroomWall"
let bedroomFloorID = 101
let bedroomWallID = 101
let documentsDirectory = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
let url = documentsDirectory.appendingPathComponent("room.plist")
print("PATH", url)
var dict : [String:Any] = ["XInitializerItem": "DoNotEverChangeMe"]
//saving values
dict[bedroomFloorKey] = bedroomFloorID
dict[bedroomWallKey] = bedroomWallID
//...
//writing to GameData.plist
let data = try PropertyListSerialization.data(fromPropertyList: dict, format: .xml, options: 0)
try data.write(to: url)
print("Saved GameData.plist file is --> \(dict)")
无需重新读取数据。如果没有抛出错误,则 plist 已成功写入。
【讨论】:
感谢您的解释和代码重写。【参考方案2】:您在文档中创建一个 plist 文件
let path = documentsDirectory.appendingPathComponent("room.plist")
这与位于您的主包中的文件不同(与 ViewController.swift
相同级别)不接受任何写入,因为包已使用应用程序签名并且不能接受任何更改
【讨论】:
好的,我明白了,但是与我的项目相关的文档在哪里? documents 文件夹由 ios 为您的应用程序创建,您无法使用项目层次结构文件浏览它以上是关于在 Swift 中写入 Plist的主要内容,如果未能解决你的问题,请参考以下文章