由于serverside swift的实现不同,因此缺少NSArray
和NSDictionary
的基本(对我的项目而言)部分。
即dictionaryWithContentsOfFile:
方法仅在Linux上加载非二进制plist文件,因此我的应用程序仅适用于macOS。有一些关于StackOverflow的旧问题回答了这个主题,但它们导致了不再存在的网站。
所以我的问题是:有没有简单的方法将二进制plist加载到NSDictionary而不必使用一些“反编译”外部脚本,如果没有解决方案,使用一个最优雅的解决方案是什么?
答案 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比较两种方法的最终结果是相同的。我认为它应该工作(?),或者至少让你对另一种读/写数据的方法有所了解。