Ответ 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
}
}