如何从 Swift 3 中的数据中读取属性列表
Posted
技术标签:
【中文标题】如何从 Swift 3 中的数据中读取属性列表【英文标题】:How can I read a property list from data in 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
,而不是一个数组。
【参考方案1】:
Dictionary
是一个泛型类型,它需要键和值的类型信息。
使用Dictionary<String,Any>
或更短的[String:Any]
:
let datasourceDictionary = try! PropertyListSerialization.propertyList(from:data!, format: nil) as! [String:Any]
options
参数可以省略。
【讨论】:
【参考方案2】:-
在 Swift 中,通常使用 [String:Any]。和值添加“nil”类型。
你应该设置选项“[]”
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。
【讨论】:
以上是关于如何从 Swift 3 中的数据中读取属性列表的主要内容,如果未能解决你的问题,请参考以下文章