将它们存储在 UserDefault 中时如何处理模型迁移?
How to handle model migration when store them in 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
}
如果我们的应用程序是从旧的应用程序更新而来的,旧的 Data
存储在 UserDefault
中。更新后应用程序要做的第一件事是获取此 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 中实现它。
您可以实现解码初始值设定项并为 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
}
}
我有一个名为 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
}
如果我们的应用程序是从旧的应用程序更新而来的,旧的 Data
存储在 UserDefault
中。更新后应用程序要做的第一件事是获取此 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 中实现它。
您可以实现解码初始值设定项并为 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
}
}