Подтвердить что ты не робот

Swift - Сохранить массив словарей в NSUserDefaults

У меня есть пустой массив корзин → var cart: [Dictionary<String, Any>] = []

И у меня есть 2 экрана, продуктыView и 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'
4b9b3361

Ответ 1

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

Словари

Swift также мосты между типом словаря и NSDictionary класс. Когда вы соединяетесь с объектом NSDictionary с параметризованным типы в словарь Swift, результирующий словарь имеет тип [Key: Стоимость]. Если объект NSDictionary не задает параметризованные типы, это подключен к Swift-словарю типа [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
    }
}

Ответ 2

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

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

Ответ 3

Это будет означать, что вы пытаетесь сохранить массив как "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")