Swift 4中如何将JSON数据保存到UserDefaults?附模型类代码
保存自定义对象到UserDefaults的解决方案
首先,核心问题是自定义对象无法直接存入UserDefaults,我们需要把UserDetails序列化成UserDefaults支持的类型(比如Data)后再存储。结合你已经在用的ObjectMapper,可以这样实现:
1. 完善保存与读取方法
修改你的Default类,补充完整的保存逻辑,同时添加读取方法方便后续获取用户数据:
class Default : NSObject{ // 定义统一的存储key,避免硬编码出错 static let savedUserKey = "persisted_user_details" static func saveToSharedPrefs(user: UserDetails?) { let defaults = UserDefaults.standard guard let validUser = user else { // 如果传入nil,清空已存储的用户数据 defaults.removeObject(forKey: savedUserKey) defaults.synchronize() return } // 用ObjectMapper将UserDetails转成字典 if let userDict = validUser.toJSON() { do { // 把字典转成可存储的Data类型 let userData = try JSONSerialization.data(withJSONObject: userDict, options: []) defaults.set(userData, forKey: savedUserKey) defaults.synchronize() } catch { print("保存用户数据失败:\(error.localizedDescription)") } } } // 读取已保存的用户数据 static func getSavedUser() -> UserDetails? { let defaults = UserDefaults.standard guard let userData = defaults.data(forKey: savedUserKey) else { return nil } do { // 将Data转回字典,再用ObjectMapper转成UserDetails对象 if let userDict = try JSONSerialization.jsonObject(with: userData, options: []) as? [String: Any] { return Mapper<UserDetails>().map(JSON: userDict) } } catch { print("读取用户数据失败:\(error.localizedDescription)") } return nil } }
2. 登录成功后的调用逻辑
当你拿到登录返回的UserRoot对象后,直接调用保存方法即可:
// 假设登录后得到了userRoot实例 if userRoot.success { Default.saveToSharedPrefs(user: userRoot.user) } else { // 登录失败时可选清空旧数据,避免残留无效信息 Default.saveToSharedPrefs(user: nil) }
3. 额外注意事项
- 如果
UserDetails里包含嵌套的自定义对象,确保这些嵌套对象也遵循了Mappable协议,否则toJSON()无法完整序列化所有属性。 defaults.synchronize()在iOS 10+并非强制调用,但加上可以确保数据立即写入磁盘,适合对实时性要求高的场景。- 若后续想切换到苹果原生序列化方案,只需让
UserDetails遵循Codable协议,用JSONEncoder/JSONDecoder替代ObjectMapper即可,代码会更简洁。
内容的提问来源于stack exchange,提问作者Gorib Developer
相关产品推荐
相关产品推荐

