如何从 Swift 中的数据中读取 属性 列表 3

How can I read a property list from data in Swift 3

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

我尝试过这样的事情:

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

我得到了这个错误:

Cannot convert value of type 'PropertyListSerialization.ReadOptions.Type' (aka 'PropertyListSerialization.MutabilityOptions.Type') to expected element type 'PropertyListSerialization.MutabilityOptions'

然后我尝试了像我以前在 Swift 1.2 上做的那样的事情:

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

我得到了这个错误:

'immutable' is unavailable: use [] to construct an empty option set

然后我试了这个:

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

我收到了这个错误:

'[Any]' is not convertible to 'PropertyListSerialization.ReadOptions' (aka 'PropertyListSerialization.MutabilityOptions')

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

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

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

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

options参数可以省略

  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)
    

文档说 .属性List(from:...) 函数 returns "a property list object"。它还说 "property list objects include NSData, NSString, NSArray, NSDictionary, NSDate, and NSNumber objects"。因此,您的第三次尝试是最接近的;你只需要将 return 值转换为 NSDictionary:

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

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