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

pek*_*pon 15 arrays dictionary nsuserdefaults ios swift

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

我有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'
Run Code Online (Sandbox Code Playgroud)

Leo*_*bus 28

编辑/更新:在Swift 3中你的字典类型可以.

字典

Swift还在Dictionary类型和NSDictionary类之间架起了桥梁.当您从具有参数化类型的NSDictionary对象桥接到Swift字典时,生成的字典的类型为[Key:Value].如果NSDictionary对象未指定参数化类型,则它将桥接到类型为[AnyHashable:Any]的Swift字典

所以[[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
    }
}
Run Code Online (Sandbox Code Playgroud)

您只需要更改声明字典数组的方式.你应该使用[String: AnyObject]而不是[String: Any].你应该这样做:

斯威夫特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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 美丽有用的答案. (2认同)