我正在使用NSUserDefaults
检索我存储的对象。
这是我的保存功能:
let archivedObject = NSKeyedArchiver.archivedData(withRootObject: imageMetadata)
UserDefaults.standard.set(archivedObject, forKey: kUserDefaultsKey)
UserDefaults.standard.synchronize()
然后我使用以下内容检索数据:
var checkDefaults : Data = UserDefaults.standard.object(forKey: kUserDefaultsKey) as! Data
var newObject = NSKeyedUnarchiver.unarchiveObject(with: checkDefaults)
var newImageMetadata : CCImageMetadata = newObject as! CCImageMetadata
当我检查 newObject 时,它的类型似乎是 CCImageMetadata
但是当我强制强制转换时,它显示为 <uninitialized>
有什么想法为什么会出现这种情况吗?看起来它没有初始化,但我不确定为什么会这样
最佳答案
这不是您问题的答案,它只是对旧的 key 存档器/取消存档器的替代方案的建议。
如果您想要更现代、更 Swift-y,您可以使用此扩展在用户默认值中存储 Codable
对象。
extension UserDefaults {
func decodable<T>(type: T.Type, forKey key: String) throws -> T? where T: Decodable {
guard let data = data(forKey: key) else { return nil }
let decoder = JSONDecoder()
return try decoder.decode(type, from: data)
}
func set<T>(value: T?, forKey key: String) throws where T: Encodable {
if let value = value {
let encoder = JSONEncoder()
let data = try encoder.encode(value)
set(data, forKey: key)
} else {
removeObject(forKey: key)
}
}
}
我想您可以对符合 NSCoding
的对象执行类似的操作。我不确定这是否有效,但是怎么样:
extension UserDefaults {
func decodable<T>(type: T.Type, forKey key: String) throws -> T? where T: NSObject, T: NSCoding {
guard let data = data(forKey: key) else { return nil }
return try NSKeyedUnarchiver.unarchivedObject(ofClass: T.self, from: data)
}
func set<T>(value: T?, forKey key: String) throws where T: NSObject, T: NSCoding {
if let value = value {
let data = try NSKeyedArchiver.archivedData(withRootObject: value, requiringSecureCoding: false)
set(data, forKey: key)
} else {
removeObject(forKey: key)
}
}
}
关于ios - 如何防止从对象的 NSUserDefaults 检索中获取 <uninitialized>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54892064/