我有一个称为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
}
}