Как предотвратить получение <uninitialized>от поиска NSUserDefaults объекта - PullRequest
0 голосов
/ 26 февраля 2019

Я использую 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 голосов
/ 27 февраля 2019

Это не ответ на ваш вопрос, это всего лишь предложение альтернативы старому архиватору / разархиватору с ключами.

Если вы хотите быть более современным и 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)
        }
    }
}
...