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
层次结构中的方式。更新您的问题以包含所需输出的示例。