L oop через массив элементов с парой ключ-значение - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть эта функция с именем «addToBasketButtonPressed ()» для добавления идентификатора элемента в мою корзину с количеством по умолчанию 1, а имя функции «incrementQty», вызываемое после else, проверяет, существует ли добавляемый элемент в корзине, и если это так, то просто увеличить кол-во на 1.

    @objc func addToBasketButtonPressed() {
    //check if user is logged in or show login view
    if MUser.currentUser() != nil {

        downloadBasketFromFirestore(MUser.currentId()) { (basket) in
            if basket == nil {
                self.createNewBasket()
            }else {

                self.incrementQty(basketId: basket!.id, itemToUpdate: self.item!.id, deltaQty: 1)

                let qty: Int = 1
                let item = self.item.id
               // let dataTosave = ("Item", item!, "Qty", qty)
                let dataTosave: [String: Any] = ["\(item)": qty]

                basket?.itemIds.append("\(dataTosave)")

                print("basket id is \(basket!.id)")
                print("current item name is \(self.item.name)")

                self.updateBasket(basket: basket!, withValues: [kITEMIDS: basket!.itemIds!])

Вот функция для увеличения кол-ва на 1, которая является ошибочной.

Ошибка 1 = Значение необязательного типа '[String: Any]?' необходимо развернуть в значение типа '[String: Any]' on line = для элемента в itemArray {

Ошибка 2 = Значение типа кортежа «(ключ: строка, значение: любое)» не имеет члена «индекс» в последних 3 строках

    func incrementQty (basketId: String, itemToUpdate: String, deltaQty: Int) {

    FirebaseReference(.Basket).document(basketId).getDocument { (documentSnapshot, error) in
    if let error = error {
                   print(error.localizedDescription)
                   return
        }

        if let documentData = documentSnapshot?.data() {

            print("item exists. update qty")
            print("document data in itemIds", documentData)

            let itemArray = documentData["itemIds"] as? [String: Int]
            print("items in item array \(itemArray)")

                    for item in itemArray! {

                    if item["Id"] == itemToUpdate {
                    print("checking document with id", item["Id"])
                    (item["Qty"] as! Int) + deltaQty
                }
            }

Если я закомментирую последние 4 строки кода и внесу следующие изменения коды, комментируя «как? [String: Any] ', как показано ниже, затем в окне отладки я вижу список элементов. Если я не закомментирую «как? [Строка: Любая] ”, тогда это ноль.

                let itemArray = documentData["itemIds"] // as? [String: Int]
            print("items in item array \(itemArray)")

enter image description here

Мой вопрос, как мне l oop через этот список чтобы проверить, существует ли уже добавляемый пользователем товар в корзину, и если это так, то просто увеличьте количество на 1, иначе добавьте количество по умолчанию 1?

примечание: данные извлекаются из базы данных Firebase.

...