NSDictionary在linux上加载二进制plist(swift)

时间:2017-02-28 08:32:47

标签: linux swift macos

由于serverside swift的实现不同,因此缺少NSArrayNSDictionary的基本(对我的项目而言)部分。 即dictionaryWithContentsOfFile:方法仅在Linux上加载非二进制plist文件,因此我的应用程序仅适用于macOS。有一些关于StackOverflow的旧问题回答了这个主题,但它们导致了不再存在的网站。 所以我的问题是:有没有简单的方法将二进制plist加载到NSDictionary而不必使用一些“反编译”外部脚本,如果没有解决方案,使用一个最优雅的解决方案是什么?

2 个答案:

答案 0 :(得分:1)

如果情况变得更糟,您可以使用GNUstep将二进制plist转换为XML,将xml保存在临时位置,然后将其加载到Swift代码中。

您可以尝试使用像CFPropertyListCreateWithData这样的CoreFoundation函数,但如果Foundation方法不起作用,我怀疑CoreFoundation是否有效。

答案 1 :(得分:1)

根据我的理解,Swift中对.plists的原生处理是通过PropertyListSerialization

// PropertyListSerialization Method

var plistFormat = PropertyListSerialization.PropertyListFormat.binary
let plistPath: String? = Bundle.main.path(forResource: "binary", ofType: "plist")!
let plistBinary = FileManager.default.contents(atPath: plistPath!)!

guard let propertyList = try? PropertyListSerialization.propertyList(from: plistBinary, options: [], format: &plistFormat) else {
    fatalError("failed to deserialize")
}
print(propertyList as! [String:Any])

结果:

  

"["MyDictionary": {\n MyArray = (\n Two,\n One\n);\n}]\n"

NSDictionary方式,如您所知:

// NSDictionary Method

if let url = Bundle.main.url(forResource:"binary", withExtension: "plist"),
    let myDict = NSDictionary(contentsOf: url) as? [String:Any] {
    print(myDict)
}

<强>结果:

  

"["MyDictionary": {\n MyArray = (\n Two,\n One\n);\n}]\n"

使用binary .plist比较两种方法的最终结果是相同的。我认为它应该工作(?),或者至少让你对另一种读/写数据的方法有所了解。