如何从 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 中的数据中读取属性列表的主要内容,如果未能解决你的问题,请参考以下文章

从 Swift 中的属性检查器列表更改条形按钮图像

VB里如何逐行读取listbox中的数据

怎么读取列表控件中的数据

如何在 Python 3 中从磁盘读取和编辑列表?

无法从 Java Spring Boot 项目中的 application.yml 文件中读取用户定义类的列表

mfc如何用txt保存下拉框控件的内容?下拉框如何读入TXT中的内容到属性-数据中?