Swift中如何将含Date?的结构体保存为Date格式而非时间戳
解决结构体中Date类型保存为时间戳的问题
你当前的代码流程是将结构体编码为JSON Data后,再转成JSON对象存入UserDefaults,这会导致两个问题:一是JSONEncoder默认用时间戳格式编码Date,二是最终存储的是字典而非原结构体,所以取出后日期会变成时间戳。
正确解决方案
直接存储结构体编码后的原始Data,读取时再解码回结构体,即可保留Date类型和完整结构体:
保存代码
do { let data = try JSONEncoder().encode(contact) UserDefaults.standard.set(data, forKey: "contact") } catch { print("编码失败:\(error)") }
读取代码
if let data = UserDefaults.standard.data(forKey: "contact") { do { let savedContact = try JSONDecoder().decode(Contact.self, from: data) print(savedContact) // Date属性保持原类型 } catch { print("解码失败:\(error)") } }
自定义日期格式(可选)
如果需要将日期以字符串格式(如ISO8601)存储而非默认的时间戳,可以给编码器和解码器设置日期策略:
// 保存时设置编码器 let encoder = JSONEncoder() encoder.dateEncodingStrategy = .iso8601 do { let data = try encoder.encode(contact) UserDefaults.standard.set(data, forKey: "contact") } catch { print("编码失败:\(error)") } // 读取时设置解码器 let decoder = JSONDecoder() decoder.dateDecodingStrategy = .iso8601 if let data = UserDefaults.standard.data(forKey: "contact") { do { let savedContact = try decoder.decode(Contact.self, from: data) print(savedContact) } catch { print("解码失败:\(error)") } }
内容的提问来源于stack exchange,提问作者Vladislav
相关产品推荐
相关产品推荐

