为何设置PropertyListEncoder输出格式为.binary却未生成二进制plist?
为什么设置PropertyListEncoder的binary格式后生成的plist看起来是XML?
问题真相
你写的代码没有问题,已经成功生成了二进制格式的plist文件,产生误解的原因是查看工具的自动转换:
- BBEdit会在打开时悄悄将二进制plist转成XML格式显示,并非文件本身是XML
- 访达的空格预览功能也会做同样的转换,展示XML版本的内容
要确认文件的真实格式,直接在终端执行命令:
file <filename>
该命令会输出文件的详细类型,明确标注是二进制plist还是XML plist。
原问题
我正在为自己的程序从文本文件创建单词列表属性列表文件。二进制属性列表比XML属性列表体积更小、读取速度更快,因此我倾向于使用前者。
为此,我编写了一段macOS命令行工具代码,读取单词列表文本文件,将内容转为大写,转换为数组后写入属性列表。修改后的示例代码如下:
let filename = "SampleWords" do { // 示例代码生成少量换行分隔的条目(实际代码从文件读取) var words = """ apple banana grape """ words = words.uppercased() let wordsArray = words.components(separatedBy: "\n") let plistEncoder = PropertyListEncoder() plistEncoder.outputFormat = .binary // 用.xml则生成XML格式 let data = try plistEncoder.encode(wordsArray) let plistPath = NSString(string: "~/Documents/\(filename).plist").expandingTildeInPath let plistURL = URL(filePath: plistPath) try data.write(to: plistURL) } catch { print("Error '\(error)' reading or encoding file") fatalError() }
运行代码后生成的SampleWords.plist在BBEdit中打开显示为:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <array> <string>APPLE</string> <string>BANANA</string> <string>GRAPE</string> </array> </plist>
代码能正常运行,文件也能作为属性列表打开,但体积约为二进制属性列表的两倍,读取速度也更慢。我是否遗漏了某个步骤?为何设置PropertyListEncoder的outputFormat后并未生成二进制属性列表?
内容的提问来源于stack exchange,提问作者Duncan C
相关产品推荐
相关产品推荐

