objective-cswiftnsuserdefaultsosx-yosemite

How to save a color in NSUserDefaults in swift?


I have a litle problem with saving a color in NSUserDefaults . In objective-c is easy :

-(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];
}

The above code works fine in objective-c, but when i try to write same code in swift, I receive errors at reading color from 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
}

Thanks , and sorry for my english !


Solution

  • For Objective C

    place like this.

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

    To get back like this.

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

    For Swift

    set like this

     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")
    }
    

    get like this.

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

    For Swift 4.2

    place like this.

    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")
    

    To get back like this.

    if let userSelectedColorData = UserDefaults.standard.object(forKey: "UserSelectedColor") as? Data {
        if let userSelectedColor = NSKeyedUnarchiver.unarchiveObject(with:userSelectedColorData as Data) as? UIColor {
            print(userSelectedColor)
        }
    }