如何防止从NSUserDefaults获取对象的<uninitialized>

时间:2019-02-26 18:38:55

标签: ios swift nsuserdefaults

我正在使用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>

inspecting custom object

有什么主意为什么会这样?似乎尚未初始化,但我不确定为什么会这样

1 个答案:

答案 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)
        }
    }
}