/ / Swift - Guarda la matriz de diccionarios en NSUserDefaults - ios, arrays, swift, dictionary, nsuserdefaults

Swift - Guarda la matriz de diccionarios en NSUserDefaults - ios, arrays, swift, dictionary, 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, éste va al carrito:

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

Si el usuario toca en más productos:

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

Ahora, cuando el usuario ha terminado de añadir productos.al carrito, quiero mostrar la segunda vista con la lista de productos, y el usuario puede realizar cambios en los productos "cantidad" o eliminar productos. Si el usuario pulsa atrás y va a la primera pantalla, quiero mostrar la lista actualizada.

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

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

Respuestas

24 para la respuesta № 1

editar / actualizar: en Swift 3 tu tipo de diccionario estaría bien.

Los diccionarios

Swift también une el tipo de diccionario.y el NSDiccionario clase. Cuando se puente desde un objeto NSDictionary con parametrizado tipos a un diccionario Swift, el diccionario resultante es de tipo [Clave: Valor]. Si un objeto NSDictionary no especifica tipos parametrizados, es puenteado a un diccionario Swift de tipo [AnyHashable: Any]

Así que declarando su arsenal de diccionarios 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 está declarando su variedad de diccionarios. Deberías usar [String: AnyObject] en lugar de [String: Any]. Debes 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
}
}

0 para la respuesta № 2

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

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

0 para la respuesta № 3

Esto se debe a que está intentando almacenar una matriz como "AnyObject".

Lo que necesitas hacer es:

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

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

let yourCartZero = userDefaults.objectForKey("cart0")

Si desea almacenar toda la matriz al mismo tiempo:

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