当前位置: 首页 > 知识库问答 >
问题:

用Swift写信给Plist

岑元徽
2023-03-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所在的文件夹相同。

谢谢

共有2个答案

澹台蕴藉
2023-03-14

在文档中创建plist文件

let path = documentsDirectory.appendingPathComponent("room.plist")

与位于主包中的文件不同(与viewcontroller.swift级别相同),该文件将不接受任何写入,因为包与应用程序签名,并且不能接受任何更改

鲍钊
2023-03-14

由于明显的原因,您无法写入应用程序包,该包是只读的。

您的代码将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已成功写入。

 类似资料:
  • Mapper正在从两个地方读取文件1)用户访问的文章(按国家排序)2)国家统计(国家明智) 两个Mapper的输出都是Text,Text 我正在运行Amazon集群的程序 我的目标是从两个不同的集合中读取数据,并将结果组合起来存储在hbase中。 HDFS到HDFS正在工作。代码在减少67%时卡住了,并给出了如下错误: 驱动程序类是 减速器等级为 属国

  • 背景信息:我有一个Kubernetes集群,有3个linux节点和1个windows节点。从詹金斯大师到特工的一切都在一个由库伯奈斯控制的容器或吊舱里。 我试图将Windows代理(在容器中)连接到Linux主服务器(也在容器中),但在使用hudson.remoting.jnlp将从服务器连接到主服务器时遇到了问题。 以下是该命令的错误: 我尝试匹配master和slave的Java版本,使用最新

  • 主要内容:写给面试官的感谢信1,写给面试官的感谢信2,写给面试官的感谢信3,写给面试官的感谢信4写给面试官的感谢信(4篇)   在人们越来越推崇感恩教育的今天,我们使用感谢信的情况越来越多,写感谢信的时候要注意感谢内容的完整。那么,感谢信需要写哪些内容呢?下面是小编为大家整理的写给面试官的感谢信,欢迎阅读,希望大家能够喜欢。 写给面试官的感谢信1 尊敬的领导:   您好!我是,是11月8号59位面试者中来自xx校区的大四本科生。   感谢x公司给了我一个面试的机会。这次面试,从各方面,开阔了

  • 本文向大家介绍用Swift编写自动录音器,包括了用Swift编写自动录音器的使用技巧和注意事项,需要的朋友参考一下 用swift编写自动录音器,自动录音和一般录音的不同点在于:不需要像微信里面需要按下录音然后松手结束,而是根据说话声音的大小自动判断该录音和该停止的点,然后可以等到录音结束之后马上播放出来。此效果很像会说话的汤姆猫那样。 在自动录音的初始化阶段需要建立两个录音对象,一个需要一直录音充

  • 我正试图构建我的第一个swift应用程序,当我试图使用soap web服务时遇到了麻烦…方法如下: 当我发送此请求时,没有得到任何响应 Web服务详细信息:Web服务类型:Axis2(基于Java和SOAP)Web服务WSDL链接:http://87.106.20.80:8080/Axis2/services/app2beeservice?WSDL Target namespace:http://

  • 问题内容: 这段代码曾经很好(在某种意义上,编译器没有抱怨): 从Swift 5.0开始,这会产生警告: 警告:不建议使用“ withUnsafeBytes”:请改用 我试着用所提出的方法,但我似乎无法缠斗到这最终需要。 如何以不推荐的方式编写此函数? 问题答案: 诀窍是使用函数: 尽管此功能适用于Swift 5.0,但显然存在一些问题。参见相关论坛讨论。