首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在UserDefault中存储模型迁移时如何处理?

在UserDefault中存储模型迁移时如何处理?
EN

Stack Overflow用户
提问于 2019-03-20 08:50:18
回答 1查看 608关注 0票数 5

我有一个名为User的对象,它符合Swift4中引入的Codable

例如,这个对象曾经是

代码语言:javascript
复制
struct User: Codable {
    var firstName: String
}

我们使用PropertyListDecoder().decode(User.self, from: data)PropertyListEncoder().encode(value)User编码成Data,并将Data解码成User

现在,我们将对象更新为

代码语言:javascript
复制
struct User: Codable {
    var firstName: String
    var isLoggedIn: Bool
}

如果我们的应用程序从旧的应用程序更新,旧的Data存储在UserDefault中。更新后,应用程序要做的第一件事就是获取这个Data,并尝试使用PropertyListDecoder().decode(User.self, from: data)解码成User。但是,它给出了一个错误:

代码语言:javascript
复制
po PropertyListDecoder().decode(User.self, from: data)
▿ DecodingError
  ▿ keyNotFound : 2 elements
    - .0 : CodingKeys(stringValue: "isLoggedIn", intValue: nil)
    ▿ .1 : Context
      - codingPath : 0 elements
      - debugDescription : "No value associated with key CodingKeys(stringValue: \"isLoggedIn\", intValue: nil) (\"isLoggedIn\")."
      - underlyingError : nil

你知道在这种情况下我该如何处理模型迁移吗?我知道对于Coredata来说,有一些简单的方法可以处理这个问题,但我不知道如何在UserDefault中实现它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-20 09:04:34

您可以实现解码初始化器并为isLoggedIn设置默认值(如果没有默认值):

代码语言:javascript
复制
struct User: Codable {
  var firstName: String
  var isLoggedIn: Bool

  enum Keys: CodingKey {
    case firstName
    case isLoggedIn
  }

  public init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)
    firstName = try container.decode(String.self, forKey: .firstName)
    isLoggedIn = try container.decodeIfPresent(Bool.self, forKey: .isLoggedIn) ?? false
  }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55252033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档