ios - 将 Codable 保存到 UserDefaults 并匹配 NSCoding 的外观
问题描述
我有一个支持该协议的struct
调用。由于它是一个结构,它不能支持协议。我想将这些s 的数组保存到. 我有没有任何问题的代码。Station
Codable
NSCoding
Station
UserDefaults
func updateRecentStations(stations: [Station]) {
let encoder = PropertyListEncoder()
encoder.outputFormat = .xml
let data = try! encoder.encode(stationsArray)
UserDefaults.standard.set(data, forKey: "RecentStations")
}
func readRecentStations() -> [Station] {
if let data = UserDefaults.standard.object(forKey: "RecentStations") as? Data {
let stations: [Station] = try! PropertyListDecoder().decode( [Station].self, from: data)
return stations
}
}
这些都有效。往返没有问题。但是如果我在Xcode中检查<<app>>.plist,或者调用print(Array(UserDefaults.standard.dictionaryRepresentation()))
显示的数据是难以辨认的。所写的Data
看起来像是以十六进制格式存储的。也就是说,如果我在文本编辑器中打开 <<app>>.plist,我可以在其中看到 xml,但 .plist 并不意味着以这种方式阅读。
UserDefaults
似乎不支持将 plist 写入 .plist 。一切正常,但因为 plist 编辑器无法阅读我写的内容,我觉得我做事的方式不正确。
有没有一种方法可以支持一个Codable
被写入的UserDefaults
对象,使其在其中以人类可读的方式保持其结构?需要明确的是,我正在寻找一种复制NSCoding
将添加到NSUserDefaults
层次结构的方式的方式。
解决方案
您存储Data
在UserDefaults
. 这将被编码为 base64 字符串,这就是为什么它不是人类可读的。
由于您正在编码为 XML 格式,因此结果Data
实际上将是表示 XML 的字符串的数据。所以创建一个String
from data
。然后将该字符串存储在UserDefaults
. UserDefaults
然后在查看plist 文件时 XML 将是可读的。
注意:以下内容未经测试。可能有错别字。
func updateRecentStations(stations: [Station]) {
let encoder = PropertyListEncoder()
encoder.outputFormat = .xml
let data = try! encoder.encode(stationsArray)
let xml = String(data: data, encoding: .utf8)!
UserDefaults.standard.set(xml, forKey: "RecentStations")
}
func readRecentStations() -> [Station] {
if let xml = UserDefaults.standard.object(forKey: "RecentStations") as? String {
let data = xml.data(using: .utf8)!
let stations: [Station] = try! PropertyListDecoder().decode( [Station].self, from: data)
return stations
}
}
推荐阅读
- graph - 从程序代码到图形的可逆投影
- django - 如何让来自 Ajax 的 Django 表单错误出现在用户屏幕上?
- angular - Angular 10 - 如何用组件中 API 的数据填充数组
- python - 给定除利率以外的所有值,如何求解利率的 EMI 公式?
- rxjs - 订阅如何运作
- python - 使用 Binance API 的这个 .create_margin_order() 函数有什么问题
- java - Java 9,尝试将 URL 添加为 XML 中的元素时出现 INVALID_CHARACTER_ERR
- sql - SQL - 使用 2 个引用连接多个表
- node.js - 尽管设置了超时,但 Bull.js 作业停止
- postgresql - DBT - 以数字为变量的 for 循环问题