Как быстро сохранить цвет в NSUserDefaults?

У меня небольшая проблема с сохранением цвета в NSUserDefaults. В Objective-C это просто:

-(NSColor *)colorForKey:(NSString *)key{
NSData  *data;
NSColor *color;
data = [[NSUserDefaults standardUserDefaults] objectForKey:key];
color= [NSUnarchiver unarchiveObjectWithData:data];
if( ! [color isKindOfClass:[NSColor class]] ){
    color = nil;
}
return color;
}

-(void)setColor:(NSColor *)color forKey:(NSString *)key{
    NSData *data = [NSArchiver archivedDataWithRootObject:color];
    [[NSUserDefaults standardUserDefaults] setObject:data forKey:key];
}

Приведенный выше код отлично работает в target-c, но когда я пытаюсь написать тот же код в swift, я получаю ошибки при чтении цвета из NSUserDefaults.

 func saveColorForKey (color:NSColor , key:NSString ) {

    var data:NSData = NSData()
    data = NSArchiver.archivedDataWithRootObject(color)
    NSUserDefaults.standardUserDefaults().setObject(data, forKey: key)
}
func colorForKey(key:NSString) -> NSColor{
    var  data: AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey(key)
    var color: AnyObject? =  NSUnarchiver.unarchiveObjectWithData(data? as NSData)

    return color as NSColor
}

Спасибо, и извините за мой английский!


person C-Viorel    schedule 20.10.2014    source источник
comment
поставьте галочку, если мой ответ верен, чтобы в будущем это помогло другим. спасибо   -  person Danial Hussain    schedule 20.10.2014


Ответы (2)


Для цели C

место такое.

NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:color];
[[NSUserDefaults standardUserDefaults] setObject:colorData forKey:@"myColor"];

Чтобы вернуться вот так.

NSData *colorData = [[NSUserDefaults standardUserDefaults] objectForKey:@"myColor"];
UIColor *color = [NSKeyedUnarchiver unarchiveObjectWithData:colorData];

Для Swift

установить вот так

 var userSelectedColor : NSData? = (NSUserDefaults.standardUserDefaults().objectForKey("UserSelectedColor") as? NSData)

if (userSelectedColor != nil) {
    var colorToSetAsDefault : UIColor = UIColor.redColor()
    var data : NSData = NSKeyedArchiver.archivedDataWithRootObject(colorToSetAsDefault)
    NSUserDefaults.standardUserDefaults().setObject(data, forKey: "UserSelectedColor")
    NSUserDefaults.standardUserDefaults().synchronize()
    println("SET DEFAULT USER COLOR TO RED")
}

получиться вот так.

if let userSelectedColorData = NSUserDefaults.standardUserDefaults().objectForKey("UserSelectedColor") as? NSData {
    if let userSelectedColor = NSKeyedUnarchiver.unarchiveObjectWithData(userSelectedColorData) as? UIColor {
        println(userSelectedColor)
    }
}

Для Swift 4.2

место такое.

let colorToSetAsDefault : UIColor = UIColor.red
let data : Data = NSKeyedArchiver.archivedData(withRootObject: colorToSetAsDefault) as Data
UserDefaults.standard.set(data, forKey: "UserSelectedColor")
UserDefaults.standard.synchronize()
print("SET DEFAULT USER COLOR TO RED")

Чтобы вернуться вот так.

if let userSelectedColorData = UserDefaults.standard.object(forKey: "UserSelectedColor") as? Data {
    if let userSelectedColor = NSKeyedUnarchiver.unarchiveObject(with:userSelectedColorData as Data) as? UIColor {
        print(userSelectedColor)
    }
}
person Danial Hussain    schedule 20.10.2014
comment
Это Objective-C. Вопрос заключался в том, как реализовать это в Swift. - person Martin R; 20.10.2014

Сохранение экземпляра NSColor в пользовательских настройках по умолчанию

сохранить значение в aColor в пользовательских настройках по умолчанию как значение для ключа aKey

NSData *theData=[NSArchiver заархивировал DataWithRootObject:aColor]; [[NSUserDefaults стандартные UserDefaults] setObject: theData forKey: aKey];

person Jaimesh Patel    schedule 20.10.2014