Ios 将可编码保存为UserDefaults并匹配NSCoding的外观
我有一个名为Ios 将可编码保存为UserDefaults并匹配NSCoding的外观,ios,swift,nsuserdefaults,userdefaults,Ios,Swift,Nsuserdefaults,Userdefaults,我有一个名为Station的struct支持Codable协议。因为它是一个结构,所以不能支持NSCoding协议。我想将这些站点的数组保存到用户默认值。我有代码可以毫无问题地完成它 func updateRecentStations(stations: [Station]) { let encoder = PropertyListEncoder() encoder.outputFormat = .xml let data = try! encoder.encode(st
Station
的struct
支持Codable
协议。因为它是一个结构,所以不能支持NSCoding
协议。我想将这些站点
的数组保存到用户默认值
。我有代码可以毫无问题地完成它
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中检查.plist,或者调用print(数组(UserDefaults.standard.dictionaryRepresentation())
显示的数据难以辨认。写入的数据
看起来像是以十六进制格式存储的。也就是说,如果我在一个文本编辑器中打开.plist,我可以看到其中的xml,但是.plist不应该以这种方式读取
UserDefaults
似乎不支持将plist写入.plist。一切都正常,但因为plist编辑无法阅读我所写的内容,我觉得我没有以正确的方式做事
有没有一种方法可以支持将
Codable
写入UserDefaults
中,使其以人类可读的方式保持其结构?明确地说,我正在寻找一种复制NSCoding
将添加到NSUserDefaults
层次结构的方法。您将数据存储在UserDefaults
中。这将被编码为base64字符串,这就是为什么它不是人类可读的
由于您正在编码为XML格式,因此生成的数据
实际上将是表示XML的字符串的数据。因此,从数据
创建一个字符串
。然后将该字符串存储在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
}
}
虽然这通常会解决我最初描述的问题,但这不是我想要的。我已经更新了问题以使其更清晰:我正在寻找一种方法,复制NSCoding
将添加到NSUserDefaults
层次结构中的方式。更新您的问题以包含所需输出的示例。