4

I'm writing a Swift app for iOS. I need to set and later retrieve a UIColor object to NSUserDefaults.

I set it 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")
}

But I can't seem to get it back because the unarchive method on NSKeyedArchiver seems to be missing in Swift.

var userSelectedColorData: NSData? = (NSUserDefaults.standardUserDefaults().objectForKey("UserSelectedColor") as NSData)
var userSelectedColor : UIColor? = NSKeyedArchiver.unarchiveObjectWithData(userSelectedColorData)

What is the proper way to do this in Swift / iOS 8?

Pang
  • 9,564
  • 146
  • 81
  • 122
user1028028
  • 6,323
  • 9
  • 34
  • 59

1 Answers1

6

Unarchiving is done with NSKeyedUnarchiver, not with NSKeyedArchiver. You also should use conditional casts (as?) to ensure that the application does not crash if the saved user default is not of the expected type:

if let userSelectedColorData  = NSUserDefaults.standardUserDefaults().objectForKey("UserSelectedColor") as? NSData {
    if let userSelectedColor = NSKeyedUnarchiver.unarchiveObjectWithData(userSelectedColorData) as? UIColor {
        println(userSelectedColor)
    }
}
Martin R
  • 529,903
  • 94
  • 1,240
  • 1,382