/ / Swift - Save Array von Wörterbüchern in NSUserDefaults - ios, Arrays, swift, wörterbuch, nsuserdefaults

Swift - Speichere Array von Wörterbüchern in NSUserDefaults - ios, arrays, swift, dictionary, nsuserdefaults

Ich habe ein leeres Einkaufswagenfeld -> var cart: [Dictionary<String, Any>] = []

Und ich habe 2 Bildschirme, productsView und resumeView. In der Produktansicht habe ich einige Produkte. Wenn der Benutzer auf ein Produkt tippt, gelangen Sie in den Warenkorb:

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

Wenn der Benutzer mehr Produkte antippt:

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

Nun, wenn der Benutzer das Hinzufügen von Produkten abgeschlossen hatIm Warenkorb möchte ich die zweite Ansicht mit der Produktliste anzeigen, und der Benutzer kann Änderungen an den Produkten "Anzahl" vornehmen oder Produkte löschen. Wenn der Benutzer auf "Zurück" tippt und zum ersten Bildschirm wechselt, möchte ich die aktualisierte Liste anzeigen.

Ich möchte NSUserDefaults verwenden, um mein Array zu speichern und die aktualisierten Daten zwischen Bildschirmen anzuzeigen. Aber ich bekomme den nächsten Fehler:

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

Antworten:

24 für die Antwort № 1

Bearbeiten / Aktualisieren: In Swift 3 wäre Ihr Wörterbuchtyp in Ordnung.

Wörterbücher

Swift überbrückt auch den Dictionary-Typund das NSDictionary Klasse. Beim Überbrücken eines NSDictionary-Objekts mit parametrisiertem Typen zu einem Swift-Wörterbuch, das resultierende Wörterbuch ist vom Typ [Key: Wert]. Wenn ein NSDictionary-Objekt keine parametrisierten Typen angibt, ist dies der Fall zu einem Swift-Wörterbuch des Typs [AnyHashable: Any]

So deklarieren Sie Ihr Array von Wörterbüchern als [[String: Any]] in Swift 3 wäre gut:


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


Sie müssen nur die Art und Weise ändern, in der Sie Ihr Array von Wörterbüchern deklarieren. Du solltest benutzen [String: AnyObject] Anstatt von [String: Any]. Sie sollten wie folgt vorgehen:

Schnell 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 für die Antwort № 2

Sie verwenden alle, die nicht AnyObject entsprechen. AnyObject verwenden, um Ihr Wörterbuch zu deklarieren,

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

0 für die Antwort № 3

Dies ist der Fall, weil Sie versuchen, ein Array als "AnyObject" zu speichern.

Was Sie tun müssen, ist:

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

Sie können dann wie folgt auf Ihr Wörterbuch zugreifen:

let yourCartZero = userDefaults.objectForKey("cart0")

Wenn Sie das gesamte Array gleichzeitig speichern möchten:

Dann kannst du folgendes verwenden:

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