standarduserdefaults standard dictionary swift nsuserdefaults

dictionary - standard - Swift NSUserDefaults no guarda el diccionario?



swift 4.2 userdefaults (5)

Tengo el siguiente código de prueba:

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

La salida de println (data0) es nula.

¿Hay algún problema con mi código? ¿Swift Dictionary se considera la lista de propiedades ahora o en la versión final?


Actualización para Swift 2, Xcode 7: como @atxe notó, los diccionarios NSUserDefaults ahora se mapean como [String, AnyObject] . Esto es una consecuencia de los Objective-C "genéricos livianos" que permiten declarar el método Objective-C como

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

(Los objetos predeterminados deben ser listas de propiedades y, en particular, las claves del diccionario solo pueden ser cadenas).

Por otro lado, un diccionario Swift se puentea automáticamente si es posible, por lo que el código original de la pregunta funciona (nuevamente):

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)

Respuesta original para Swift 1.2: los valores predeterminados del usuario pueden almacenar objetos NSDictionary . Estos se asignan a Swift como [NSObject : AnyObject] :

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

Y tenga en cuenta que dictionaryForKey() devuelve un archivo opcional, por lo que debe verificarlo, por ejemplo, con una asignación opcional:

if let data0 = userDefaults.dictionaryForKey(akey) { print(data0) } else { print("not set") } // Output: [b: 2.0, a: 1.0]


Me enfrenté a este problema ayer y archivé un radar: No puedo almacenar el diccionario en NSUserDefaults en iOS8 . Este problema está relacionado solo con iOS 8. También describí una solución para este caso: Solución para guardar el diccionario en NSUserDefaults . Funciona de maravilla.

/// 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]


NSData debe convertirlo en NSData . Algo como esto:

var data = NSKeyedArchiver.archivedDataWithRootObject(jo) var userDefaults = NSUserDefaults.standardUserDefaults() userDefaults.setObject(data, forKey:akey)


// swift 4.0

// para guardar

let userDefaults = UserDefaults.standard userDefaults.setValue(value, forKey: "Your_Key") userDefaults.synchronize()

// para recuperar

let loadedCart = UserDefaults.standard.dictionary(forKey: "Your_Key")


Sigue este hermoso código a continuación -> 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; }