我正在使用NSCoding
将代码库转换为使用Codable
。尝试恢复使用NSCoding
编码的数据时,我遇到了一个问题。我有一个用代码编码的对象:
let encodedUser = NSKeyedArchiver.archivedData(withRootObject: user)
let userDefaults = UserDefaults.standard
userDefaults.set(encodedUser, forKey: userKey)
userDefaults.synchronize()
之前使用代码解码:
if let encodedUser = UserDefaults.standard.data(forKey: userKey) {
if let user = NSKeyedUnarchiver.unarchiveObject(with: encodedUser) as? User {
\\ do stuff
}
}
将User
对象更新为Codable
后,我尝试更新存档/取消归档代码以使用PropertyListDecoder
,因为我看到archivedData(withRootObject:)
返回格式为{的数据{1}}。运行此代码时:
NSPropertyListBinaryFormat_v1_0
我正在寻找的第一个密钥出现if let encodedUser = UserDefaults.standard.data(forKey: userKey) {
let user = try! PropertyListDecoder().decode(User.self, from: encodedUser)
\\ do stuff
}
错误,并且在我的keyNotFound
中进行了断点,我可以看到容器没有密钥。我还尝试使用init(from: Decoder)
来查看是否可以将结果传递给PropertyListSerialization.propertyList(from:options:format)
,但该函数给了我一个PropertyListDecoder
,其结构非常奇怪,但似乎包含我正在寻找的所有数据。
如果用NSCFDictionary
编码对象,那么使用Codable
API解码对象是否可能?我怎样才能做到这一点?
答案 0 :(得分:0)
我认为答案几乎肯定是否定的,您无法使用Codable
来解码NSCoding
编码的内容。我想摆脱代码库中的所有NSCoding
错误,并确定了迁移路径,我在关键数据模型中实现了两种协议,将存储的数据从NSCoding
转换为{{1} }格式,我将在有足够的用户更新时删除NSCoding。