Swift NSUserDefaults not saving Dictionary? - Printable Version +- 0Day Forums (https://zeroday.vip) +-- Forum: Coding (https://zeroday.vip/Forum-Coding) +--- Forum: Swift (https://zeroday.vip/Forum-Swift) +--- Thread: Swift NSUserDefaults not saving Dictionary? (/Thread-Swift-NSUserDefaults-not-saving-Dictionary) |
Swift NSUserDefaults not saving Dictionary? - strawberry43 - 07-19-2023 I have the following test code: func testSaveDictionary() { let userDefaults = NSUserDefaults.standardUserDefaults() var jo = [ "a" : "1.0", "b" : "2.0" ] let akey = "aKey" userDefaults.setObject(jo, forKey: akey) var isOk = userDefaults.synchronize() var data0 = userDefaults.dictionaryForKey(akey) println(data0) } The output of println(data0) is nil. Anything wrong with my code? Is Swift Dictionary considered property list now or in the final release? RE: Swift NSUserDefaults not saving Dictionary? - allseed120 - 07-19-2023 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] RE: Swift NSUserDefaults not saving Dictionary? - moreover747 - 07-19-2023 **Follow this beautiful code below** -> Swift 3 public func setDict(dict: NSDictionary) { let data = NSKeyedArchiver.archivedData(withRootObject: dict) let userDefaults = UserDefaults.standard userDefaults.set(data, forKey:"keyHere") } public func getDict() -> NSDictionary { let data = UserDefaults.standard.object(forKey: "keyHere") as! NSData let object = NSKeyedUnarchiver.unarchiveObject(with: data as Data) as! NSDictionary return object; } RE: Swift NSUserDefaults not saving Dictionary? - sethian926989 - 07-19-2023 **//swift 4.0** //for saving let userDefaults = UserDefaults.standard userDefaults.setValue(value, forKey: "Your_Key") userDefaults.synchronize() //for for retrieve let loadedCart = UserDefaults.standard.dictionary(forKey: "Your_Key") RE: Swift NSUserDefaults not saving Dictionary? - transcriptions784438 - 07-19-2023 I faced with this problem yesterday and filed a radar: [Cannot store Dictionary in NSUserDefaults in iOS8][1]. This issue is related only to iOS 8. Also I described a workaround for this case: [Workaround for saving dictionary in NSUserDefaults][2]. Works like a charm. [1]: [To see links please register here] [2]:[To see links please register here] /// Save NSUserDefaults.standardUserDefaults().setObject(NSKeyedArchiver.archivedDataWithRootObject(object), forKey: key) /// Read var data = NSUserDefaults.standardUserDefaults().objectForKey(key) as NSData var object = NSKeyedUnarchiver.unarchiveObjectWithData(data) as [String: String] RE: Swift NSUserDefaults not saving Dictionary? - audi832 - 07-19-2023 You need to convert it into `NSData` first. Something like this: var data = NSKeyedArchiver.archivedDataWithRootObject(jo) var userDefaults = NSUserDefaults.standardUserDefaults() userDefaults.setObject(data, forKey:akey) |