PropertyListEncoder忽略.binary输出格式问题求助
解决PropertyListEncoder输出二进制plist无效的问题
嘿,我马上就能帮你定位问题!你遇到的情况大概率是编码过程被静默失败了,导致你看到的其实是之前生成的XML格式旧文件,而不是新代码的输出。
问题根源
你用了try? plistEncoder.encode(array)这种写法,它会把编码过程中的错误直接吞掉——如果编码意外失败,data就会是nil,后续的写入逻辑根本不会执行。这时候你看到的array.plist其实是之前运行未设置outputFormat代码时生成的旧文件,自然还是XML格式。
修正后的代码
把错误处理改成显式的do-catch,再加上格式验证,就能确认问题并生成正确的二进制plist:
import Foundation var array = ["one", "two", "three"] let plistEncoder = PropertyListEncoder() plistEncoder.outputFormat = .binary do { // 显式捕获编码错误 let data = try plistEncoder.encode(array) // 验证生成的数据格式 if let format = try? PropertyListSerialization.propertyListFormat(from: data) { print("生成的plist格式:\(format == .binary ? "二进制" : "XML")") } let url = URL(fileURLWithPath:"array.plist") try data.write(to: url) print("文件已成功写入,路径:\(url.path)") } catch { // 打印错误信息,排查问题 print("处理过程出错:\(error.localizedDescription)") }
额外注意事项
- 清理旧文件:先删除当前目录下的
array.plist,避免旧文件干扰测试结果 - 验证文件类型:用终端命令
file array.plist查看文件类型,二进制plist会显示Apple binary property list,而XML格式会显示XML 1.0 document - 确认路径权限:确保你的命令行工具有权限写入目标路径(当前目录一般没问题,但如果是其他路径需要检查)
这样修改后,你就能得到真正的二进制属性列表文件了。
内容的提问来源于stack exchange,提问作者Duncan C
相关产品推荐
相关产品推荐

