Разархивируйте NSData обратно в NSColor быстро

Я заархивировал NSColor, чтобы сохранить его в NSUserDefaults:

var data = NSArchiver.archivedDataWithRootObject(NSColor.redColor())
storage.setObject(data, forKey: "color")
storage.synchronize()

Но теперь мне нужно вернуть цвет из NSData, я понятия не имею, как это сделать.


person pomo_mondreganto    schedule 30.01.2015    source источник


Ответы (2)


Вам просто нужно использовать if let, чтобы развернуть ваши NSData, а также вам понадобится условное приведение, как показано ниже:

изменить/обновить:

Swift 3 или более поздней версии

// archiving
let color: NSColor = .red
let data = NSKeyedArchiver.archivedData(withRootObject: color)
UserDefaults.standard.set(data, forKey: "color")

// unarchiving 
if let loadedData = UserDefaults.standard.data(forKey: "color"), 
    let loadedColor =  NSKeyedUnarchiver.unarchiveObject(with: loadedData) as? NSColor {
    // you can access loadedColor here
    print(loadedColor)  // "sRGB IEC61966-2.1 colorspace 1 0 0 1\n"
}
person Leo Dabus    schedule 30.01.2015

Столкнулся с некоторыми ошибками, пытаясь заставить ответ Лео работать в Swift 5. Придумал это расширение, которое позволяет UserDefaults хранить и извлекать цвета. Попробуйте вставить это в игровую площадку.

import Cocoa

extension UserDefaults {

    func set(_ color: NSColor, forKey: String) {
        if let data = try? NSKeyedArchiver.archivedData(withRootObject: color, requiringSecureCoding: false) {
            self.set(data, forKey: forKey)
        }
    }

    func color(forKey: String) -> NSColor? {
        guard
            let storedData = self.data(forKey: forKey),
            let unarchivedData = try? NSKeyedUnarchiver.unarchivedObject(ofClass: NSColor.self, from: storedData),
            let color = unarchivedData as NSColor?
        else {
            return nil
        }

        return color
    }

}

// get defaults instance
let defaults = UserDefaults.standard

// create a color
let mycolor = NSColor(red: 0.0, green: 0.5, blue: 0.8, alpha: 0.5)

// save the color
defaults.set(mycolor, forKey: "mycolor")

// read the color back. this returns an optional, may be nil
defaults.color(forKey: "mycolor")
person Pascal    schedule 11.05.2019