You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何设置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 18:23:20