Swift NSUserDefaults not saving Dictionary?

Update for Swift 2, Xcode 7: As @atxe noticed, NSUserDefaults dictionaries are now mapped as [String, AnyObject]. This is a
consequence of the Objective-C “lightweight generics” which allow
to declare the Objective-C method as

- (NSDictionary<NSString *,id> *)dictionaryForKey:(NSString *)defaultName

(Default objects must be property lists and in particular the dictionary
keys can only be strings.)

On the other hand, a Swift dictionary is bridged automatically if possible, so the original code from the question works (again):

let jo = [
    "a" : "1.0",
    "b" : "2.0"
]

let akey = "aKey"
// Swift 2:
userDefaults.setObject(jo, forKey: akey)
// Swift 3:
userDefaults.set(jo, forKey: akey)

Original answer for Swift 1.2:
The user defaults can store NSDictionary objects. These are mapped to Swift
as [NSObject : AnyObject]:

var jo : [NSObject : AnyObject] = [
    "a" : "1.0",
    "b" : "2.0"
] 
userDefaults.setObject(jo, forKey: akey)
var isOk = userDefaults.synchronize()

And note that dictionaryForKey() returns an optional, so you should check it
for example with an optional assignment:

if let data0 = userDefaults.dictionaryForKey(akey) {
    print(data0)
} else {
    print("not set")
}

// Output: [b: 2.0, a: 1.0]

Leave a Comment