Codable API可用于解码用NSKeyedArchiver.archivedData编码的数据吗?

时间:2018-02-01 02:31:16

标签: swift nskeyedarchiver codable property-list

我正在使用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解码对象是否可能?我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

我认为答案几乎肯定是否定的,您无法使用Codable来解码NSCoding编码的内容。我想摆脱代码库中的所有NSCoding错误,并确定了迁移路径,我在关键数据模型中实现了两种协议,将存储的数据从NSCoding转换为{{1} }格式,我将在有足够的用户更新时删除NSCoding。