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



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

例如,此对象曾经为

struct User: Codable {
    var firstName: String
}

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

现在,我们更新了对象为

struct User: Codable {
    var firstName: String
    var isLoggedIn: Bool
}

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

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中实现它。

您可以实现Decode Initializer并设置isLoggedIn的默认值,如果没有:

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
  }
}

最新更新