我正在使用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>
有什么主意为什么会这样?似乎尚未初始化,但我不确定为什么会这样
答案 0 :(得分:0)
这不是对您问题的答案,仅是替代旧密钥存档程序/取消存档程序的建议。
如果您想使用更现代的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)
}
}
}