Swift: guarda la matriz de dictionarys en NSUserDefaults

Tengo una matriz de carrito vacía -> var cart: [Dictionary<String, Any>] = []

Y tengo 2 pantallas, productsView y resumeView. En la vista de productos, tengo algunos productos. Cuando el usuario toca un producto, esto va al carrito:

cart = [[name: "A", price: "1", qty: "1"]]

Si el usuario usa más productos:

cart = [[name: "A", price: "1", qty: "3"],[name: "B", price: "2", qty: "1"]]

Ahora, cuando el usuario haya terminado de agregar productos al carrito, quiero mostrar la segunda vista con la list de productos, y el usuario puede hacer cambios a los productos "qty" o eliminar productos. Si el usuario toca atrás y va a la primera pantalla, quiero mostrar la list actualizada.

Quiero usar NSUserDefaults para save mi matriz y mostrar los datos actualizados entre pantallas. Pero estoy recibiendo el siguiente error:

 Type '[Dictionary<String, Any>]' does not conform to protocol 'AnyObject' 

editar / actualizar: en Swift 3 su tipo de dictionary estaría bien.

Diccionarios

Swift también tiende puentes entre el tipo de dictionary y la class NSDictionary. Cuando se puentea desde un object NSDictionary con types parametrizados a un dictionary Swift, el dictionary resultante es del tipo [Clave: Valor]. Si un object NSDictionary no especifica types parametrizados, se puentea en un dictionary Swift del tipo [AnyHashable: Any]

Así que declarar su set de dictionarys como [[String: Any]] en Swift 3 estaría bien:


Xcode 8 • Swift 3

 var cart: [[String: Any]] = [] cart.append(["name": "A", "price": 19.99, "qty": 1]) cart.append(["name": "B", "price": 4.99, "qty": 2]) UserDefaults.standard.set(cart, forKey: "myCart") if let loadedCart = UserDefaults.standard.array(forKey: "myCart") as? [[String: Any]] { print(loadedCart) // [[price: 19.99, qty: 1, name: A], [price: 4.99, qty: 2, name: B]]" for item in loadedCart { print(item["name"] as! String) // A, B print(item["price"] as! Double) // 19.99, 4.99 print(item["qty"] as! Int) // 1, 2 } } 


Solo necesita cambiar la forma en que declara su matriz de dictionarys. Debe usar [String: AnyObject] lugar de [String: Any] . Deberías hacer lo siguiente:

Swift 2.3

 var cart: [[String: AnyObject]] = [] cart.append(["name": "A", "price": 19.99, "qty": 1]) cart.append(["name": "B", "price": 4.99, "qty": 2]) NSUserDefaults().setObject(cart, forKey: "myCart") if let loadedCart = NSUserDefaults().arrayForKey("myCart") as? [[String: AnyObject]] { print(loadedCart) // [[price: 19.99, qty: 1, name: A], [price: 4.99, qty: 2, name: B]]" for item in loadedCart { print(item["name"] as! String) // A, B print(item["price"] as! Double) // 19.99, 4.99 print(item["qty"] as! Int) // 1, 2 } } 

Está utilizando Any que no se ajusta a AnyObject. Use AnyObject para declarar su dictionary,

 var cart: [Dictionary<String, AnyObject>] = [["name": "A", "price": "1", "qty": "3"],["name": "B", "price": "2", "qty": "1"]] 

Esto es porque está intentando almacenar una matriz como "AnyObject".

Lo que debe hacer es:

 var counter = 0 for c in cart { userDefaults.setObject(c, forKey: "cart\(counter)") counter++ } 

A continuación, puede acceder a su dictionary de esta manera:

 let yourCartZero = userDefaults.objectForKey("cart0") 

Si desea almacenar toda la matriz al mismo time:

Entonces puedes usar esto:

 var saving: Dictionary<String, [Dictionary<String, Any>]> var cart: [Dictionary<String, Any>] = [] var savingCart: Dictionary<String, [Dictionary<String, Any>]> = ["savedCard" : cart] userDefaults.setObject(savingCart, forKey: "Carts")