在 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的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3:无法将数据写入 plist 文件

SWIFT 写入 plist 未更新

将数组内容(自定义类型)写入 plist 作为 swift 中的键控数组

SWIFT:初始写入/删除后无法删除 Plist 文件

将嵌套字典写入 plist (Swift) 时的类型问题

SpriteKit Swift 2 无法写入 plist