Swift - 将字典数组保存到NSUserDefaults中

15

我有一个空的购物车数组 -> var cart: [Dictionary<String, Any>] = []

然后我有2个界面,产品视图和结算视图。在产品视图中,我有一些产品。当用户点击某个产品时,它将被添加到购物车中:

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'

应该使用 AnyObject 而不是 Any。 - Uttam Sinha
3个回答

29

编辑/更新:在Swift 3中,您的字典类型将是可以使用的。

字典

Swift 还能够桥接 Dictionary 类型和 NSDictionary 类。当您从带参数类型的 NSDictionary 对象转换为 Swift 字典时,结果的字典类型为 [Key: Value]。如果 NSDictionary 对象未指定参数类型,则桥接到 Swift 字典类型为 [AnyHashable: Any]。

因此,在 Swift 3 中,将您的字典数组声明为 [[String: Any]] 是可以的:


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
优美而有帮助的回答。 - Curnelious

1
这是因为您试图将数组存储为“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")

0

您正在使用 Any,但它不符合 AnyObject 的要求。请使用 AnyObject 来声明您的字典。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接