web-dev-qa-db-ja.com

Swift-辞書の配列をNSUserDefaultsに保存します

カート配列が空です-> var cart: [Dictionary<String, Any>] = []

また、productsViewとresumeViewの2つの画面があります。製品ビューにいくつかの製品があります。ユーザーが商品をタップすると、カートに移動します。

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

ユーザーが他の商品をタップした場合:

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

ここで、ユーザーがカートへの商品の追加を完了したときに、商品リストを含む2番目のビューを表示します。これにより、ユーザーは商品の「数量」を変更したり、商品を削除したりできます。ユーザーが戻るをタップして最初の画面に移動すると、更新されたリストが表示されます。

NSUserDefaultsを使用して配列を保存し、画面間で更新されたデータを表示したいと思います。しかし、次のエラーが発生します。

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

編集/更新: in Swift 3辞書タイプは大丈夫でしょう。

辞書

Swiftは、DictionaryタイプとNSDictionaryクラスの間の橋渡しもします。パラメータ化されたタイプのNSDictionaryオブジェクトからSwiftディクショナリにブリッジする場合、結果のディクショナリはタイプ[キー:値]になります。NSDictionaryオブジェクトがパラメータ化されたタイプを指定しない場合、ブリッジされますa Swiftタイプの辞書[AnyHashable:Any]

したがって、辞書の配列を[[String: Any]]としてSwift 3で宣言することは問題ありません。


Xcode 8•Swift

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.

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
    }
}
27
Leo Dabus

AnyObjectに準拠していないAnyを使用しています。 AnyObjectを使用して辞書を宣言し、

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

これは、配列を「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
Dejan Skledar