2015-04-10 4 views
12

У меня есть пустой корзины массив ->var cart: [Dictionary<String, Any>] = []Swift - Сохранить массив словарей в NSUserDefaults

И у меня есть 2 экрана, productsView и resumeView. В представлении продуктов у меня есть некоторые продукты. Когда пользователь нажимает на продукт, это идет в корзине:

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

Если пользователь нажимает на больше продуктов:

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

Теперь, когда пользователь закончил добавление продуктов в корзину, я хочу показать второе представление в списке продуктов, и пользователь может внести изменения в продукты «qty» или удалить продукты. Если пользователь отступает назад и переходит на первый экран, я хочу показать обновленный список.

Я хочу использовать NSUserDefaults для сохранения моего массива и отображения обновленных данных между экранами. Но я получаю следующую ошибку:

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

Должен быть AnyObject не Любой. –

ответ

21

изменить/обновить: в Swift 3 ваш тип слова будет в порядке.

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]

Так объявляя свой массив словарей как [[String: Any]] в Swift 3 будет в порядке:


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


Вам просто нужно изменить способ объявления вашего массива словарей. Вы должны использовать [String: AnyObject] вместо [String: Any]. Вы должны сделать следующее:

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

Красивый полезный ответ. – Curnelious

0

Вы используете Any, который не соответствует AnyObject. Используйте AnyObject для объявления вашего словаря,

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

Это обусловлено вы пытаетесь сохранить массив как «AnyObject».

Что вам нужно сделать, это:

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

Вы можете получить доступ к словарю, как это:

let yourCartZero = userDefaults.objectForKey("cart0") 

Если вы хотите сохранить весь массив в то же время:

Тогда вы можете использовать это:

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") 
Смежные вопросы