2015-04-10 45 views
12

ho un carrello array vuoto ->var cart: [Dictionary<String, Any>] = []Swift - Salva Array di dizionari in NSUserDefaults

E io avere 2 schermi, ProdottiGuarda e resumeView. Nella vista prodotti ho alcuni prodotti. Quando l'utente tocca su un prodotto, questo va al carrello:

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

Se l'utente tocca su più prodotti:

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

Ora, quando l'utente ha finito di aggiungere i prodotti al carrello, voglio mostrare la seconda vista con l'elenco dei prodotti e l'utente può apportare modifiche ai prodotti "qty" o eliminare i prodotti. Se l'utente tocca indietro e va alla prima schermata, voglio mostrare l'elenco aggiornato.

Desidero utilizzare NSUserDefaults per salvare il mio array e mostrare i dati aggiornati tra le schermate. Ma sto ottenendo il prossimo errore:

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

Dovrebbe essere AnyObject non Any. –

risposta

21

modifica/aggiornamento: in Swift 3 il tuo tipo di dizionario sarebbe ok.

Dictionaries

Swift also bridges between the Dictionary type and the NSDictionary class. When you bridge from an NSDictionary object with parameterized types to a Swift dictionary, the resulting dictionary is of type [Key: Value]. If an NSDictionary object does not specify parameterized types, it is bridged to a Swift dictionary of type [AnyHashable: Any]

Così dichiara l'array di dizionari come [[String: Any]] a Swift 3 andrebbe bene:


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


Hai solo bisogno di cambiare il modo in cui stai dichiarando il tuo array di dizionari. È necessario utilizzare [String: AnyObject] anziché [String: Any]. Si dovrebbe fare come segue:

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 
    } 
} 
+1

Bella risposta utile. – Curnelious

0

Si sta utilizzando Qualsiasi che non è conforme a AnyObject. Utilizzare AnyObject per dichiarare il dizionario,

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

Questo è perché si sta tentando di memorizzare un array come "AnyObject".

Quello che dovete fare è:

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

È quindi possibile accedere al dizionario come questo:

let yourCartZero = userDefaults.objectForKey("cart0") 

Se si desidera memorizzare l'intera matrice, allo stesso tempo:

Quindi è possibile utilizzare questo:

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