【问题标题】:How can I read a property list from data in Swift 3如何从 Swift 3 中的数据中读取属性列表
【发布时间】:2016-09-29 16:21:30
【问题描述】:

我正在尝试在 Swift 3 中从 Data 读取 property list,但我无法实现。

我尝试过这样的事情:

let datasourceDictionary = try! PropertyListSerialization.propertyList(from: data!, options: [PropertyListSerialization.ReadOptions], format: nil) as! Dictionary

我得到了这个错误:

无法将类型“PropertyListSerialization.ReadOptions.Type”(又名“PropertyListSerialization.MutabilityOptions.Type”)的值转换为预期的元素类型“PropertyListSerialization.MutabilityOptions”

然后我尝试了类似以前在 Swift 1.2 上做的事情:

let datasourceDictionary = try! PropertyListSerialization.propertyList(from: data!, options: [PropertyListSerialization.MutabilityOptions.immutable], format: nil) as! Dictionary

我得到了这个错误:

'immutable'不可用:使用[]构造一个空的选项集

然后我尝试了这个:

let datasourceDictionary = try! PropertyListSerialization.propertyList(from: data!, options: [], format: nil) as! Dictionary

我得到了这个错误:

“[Any]”不能转换为“PropertyListSerialization.ReadOptions”(又名“PropertyListSerialization.MutabilityOptions”)

如何从 Swift 3 中的“数据”中读取 property list 文件,或者有什么方法可以做到这一点?

【问题讨论】:

  • 选项值真的应该是一个数组吗?
  • @PhillipMills 在这种情况下,它是一个空的OptionSet,而不是一个数组。

标签: swift nsdata swift3


【解决方案1】:

Dictionary 是一个泛型类型,它需要键和值的类型信息。

使用Dictionary<String,Any>或更短的[String:Any]

let datasourceDictionary = try! PropertyListSerialization.propertyList(from:data!, format: nil) as! [String:Any]

options参数可以省略。

【讨论】:

    【解决方案2】:
    1. 在 Swift 中,通常使用 [String:Any]。和值添加“nil”类型。
    2. 你应该设置选项“[]”

      let pathStr = Bundle.main.path(forResource: "Info", ofType: "plist")
      let data :NSData? = NSData(contentsOfFile: pathStr!)
      let datasourceDictionary = try! PropertyListSerialization.propertyList(from: data as! Data, options: [], format: nil) as! [String:Any]
      print(datasourceDictionary.self)
      

    【讨论】:

      【解决方案3】:

      文档说 .propertyList(from:...) 函数返回“属性列表对象”。它还说“属性列表对象包括 NSData、NSString、NSArray、NSDictionary、NSDate 和 NSNumber 对象”。因此,您的第三次尝试是最接近的;您只需要将返回值转换为 NSDictionary:

      let datasourceDictionary = try! PropertyListSerialization.propertyList(from: data!, options: [], format: nil) as! NSDictionary
      

      将其转换为 [String: Any] 的公认答案当然也有效,但如果有人偶然发现这个问题,其中根对象是一个数组(如我自己)的属性列表,那么很高兴知道结果应该转换成 NS_something,比如 NSArray 或 NSDictionary。

      【讨论】:

        猜你喜欢
        • 2017-02-25
        • 2013-11-23
        • 2012-05-19
        • 1970-01-01
        • 1970-01-01
        • 2011-10-09
        • 2017-08-20
        • 2020-03-17
        相关资源
        最近更新 更多