ios - 如何防止从对象的 NSUserDefaults 检索中获取 <uninitialized>

标签 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

有什么想法为什么会出现这种情况吗?看起来它没有初始化,但我不确定为什么会这样

最佳答案

这不是您问题的答案,它只是对旧的 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/

相关文章:

ios - 使用 Swift 更新动画中的约束

objective-c - 如果我使用 "registerDefaults"注册默认值,我无法删除我注册的默认值

java - BufferedWritter-like 来自 java on swift?

Swift: '!=' 不能应用于类型为 'String' 和 'Any' 的操作数

objective-c - iOS 应用之间同步数据有什么好的解决方案?

android - 在Google Play控制台中限制Flutter应用的屏幕尺寸

ios - 通过参数判断子类类型,报错 "Use of undeclared type "。我能怎么做?

xcode - 导出 Xcode 的代码覆盖率数据

ios - gl_PointSize OpenGLES 说明

c# - 如何将 ContentPage 与 UIViewController 一起使用 - VisualStudio IOS