Как я могу пройти через документ пожарного депо, имеющий массив карт? - PullRequest
0 голосов
/ 31 марта 2020

Я в основном работаю со словарями, так как я новичок, но здесь у нас есть встроенная структура, через которую мне нужно пройти oop. При этом мне нужно иметь возможность заполнять расширяющиеся ячейки в UITableView.

Моя структура выглядит так:

struct Complain: Codable {
    let eMail, message, timeStamp, userEmail: String
    let status: Bool
    let planDetails: PlanDetails

    enum CodingKeys: String, CodingKey {
        case eMail = "E-mail"
        case message = "Message"
        case timeStamp = "Time_Stamp"
        case userEmail = "User_Email"
        case status, planDetails
    }
}

// MARK: - PlanDetails
struct PlanDetails: Codable {
    let menuItemName: String
    let menuItemQuantity: Int
    let menuItemPrice: Double
}

И мой запрос выглядит так:

db.collection("Feedback_Message").getDocuments() { documentSnapshot, error in
            if let error = error {
                print("error:\(error.localizedDescription)")
            } else {
                for document in documentSnapshot!.documents {
                    let eMail = document.get("E-mail")
                    let message = document.get("Message")
                    let timeStamp = document.get("Time_Stamp")
                    let userEmail = document.get("User_Email")
                    let planDetails = document.get("planDetails")

                    // how to loop through planDetails
            }
        }

enter image description here

Я получил это далеко:

db.collection("Feedback_Message").getDocuments() { documentSnapshot, error in
            if let documentSnapshot = documentSnapshot {
                for document in documentSnapshot.documents {
                    guard let planDetails = document.get("planDetails") as? [[String : Any]] else {
                        let email = document.get("E-mail")
                        let message = document.get("Message")
                        let timeStamp = document.get("Time_Stamp")
                        let userEmail = document.get("User_Email")
                        let status = false
                    }
                    for plan in planDetails {
                        if let menuItemName = plan["menuItemName"] as? String {
                            // not sure I populate the menuItemsName, menuItemsQuantity and menuItemsPrice within the array
                        }
                    }

                }
            }
        }

ОБНОВЛЕНИЕ 2: enter image description here

Окончательный запрос: Наконец-то все работает как положено. Но я не могу заселить расширяющиеся клетки.

db.collection("Feedback_Message").getDocuments() { documentSnapshot, error in
            if let documentSnapshot = documentSnapshot {
                for document in documentSnapshot.documents {
                    guard let planDetails = document.get("planDetails") as? [[String : Any]],
                        let email = document.get("E-mail") as? String,
                        let message = document.get("Message") as? String,
                        let timeStamp = document.get("Time_Stamp") as? String,
                        let userEmail = document.get("User_Email") as? String,
                        let status = document.get("status") as? Bool else {
                            continue
                        }
                    for plan in planDetails {
                        guard let menuItemName = plan["menuItemName"] as? String,
                            let menuItemQuantity = plan["menuItemQuantity"] as? Int,
                            let menuItemPrice = plan["menuItemPrice"] as? Double else {
                                continue
                        }
                        let planDetails = PlanDetails(menuItemName: menuItemName, menuItemQuantity: menuItemQuantity, menuItemPrice: menuItemPrice)
                        let complaint = Complain(eMail: email, message: message, timeStamp: timeStamp, userEmail: userEmail, status: status, planDetails: planDetails)
                        self.messageArray.append(complaint)
                        print(self.messageArray)
                    }
                }
            }
        }

Ответы [ 2 ]

2 голосов
/ 31 марта 2020

РЕДАКТИРОВАТЬ

// OPTION 1 - FULL REQUIREMENT

db.collection("Feedback_Message").getDocuments() { documentSnapshot, error in

    if let documentSnapshot = documentSnapshot {

        for document in documentSnapshot.documents {

            // all of these properties are required to parse a single document
            guard let planDetails = document.get("planDetails") as? [[String : Any]],
                let email = document.get("E-mail") as? String,
                let message = document.get("Message") as? String,
                let timeStamp = document.get("Time_Stamp") as? String,
                let userEmail = document.get("User_Email") as? String,
                let status = document.get("status") as? Bool else {
                    continue // continue this loop
            }

            for plan in planDetails {

                // all of these properties are required to instantiate a struct
                guard let name = plan["menuItemName"] as? String,
                    let price = plan["menuItemName"] as? Double,
                    let quantity = plan["menuItemQuantity"] as? Int else {
                        continue // continue this loop
                }

                let plan = PlanDetails(menuItemName: name, menuItemQuantity: quantity, menuItemPrice: price)
                // then you will likely append this plan to an array

            }

        }

    }

}

// OPTION 2 - PARTIAL REQUIREMENT

db.collection("Feedback_Message").getDocuments() { documentSnapshot, error in

    if let documentSnapshot = documentSnapshot {

        for document in documentSnapshot.documents {

            // all of these properties are required to parse a single document
            guard let planDetails = document.get("planDetails") as? [[String : Any]],
                let email = document.get("E-mail") as? String,
                let message = document.get("Message") as? String else {
                    continue // continue this loop
            }

            // these properties are not required
            let timeStamp = document.get("Time_Stamp") as? String // optional (can be nil)
            let userEmail = document.get("User_Email") as? String // optional (can be nil)
            let status = document.get("status") as? Bool ?? false // not optional because it has a default value of false

            for plan in planDetails {

                // all of these properties are required to instantiate a struct
                guard let name = plan["menuItemName"] as? String,
                    let price = plan["menuItemName"] as? Double,
                    let quantity = plan["menuItemQuantity"] as? Int else {
                        continue // continue this loop
                }

                let plan = PlanDetails(menuItemName: name, menuItemQuantity: quantity, menuItemPrice: price)
                // then you will likely append this plan to an array

            }

        }

    }

}

Существует ряд других способов сделать это, это всего лишь пара. Например, вы можете создать экземпляр структуры с помощью самого словаря [String: Any].

0 голосов
/ 04 апреля 2020

Я наконец понял, в чем проблема. Пришлось сделать так, как я настроил структуру и как я заполнил массив.

Правильный путь как таковой, то есть planDetails должен быть приведен как массив:

struct Complain: Codable {
    let eMail, message, timeStamp, userEmail: String
    let status: Bool
    let planDetails: [PlanDetails]

    enum CodingKeys: String, CodingKey {
        case eMail = "E-mail"
        case message = "Message"
        case timeStamp = "Time_Stamp"
        case userEmail = "User_Email"
        case status, planDetails
    }
}

// MARK: - PlanDetails
struct PlanDetails: Codable {
    let menuItemName: String
    let menuItemQuantity: Int
    let menuItemPrice: Double
}

И затем Мне нужно перебрать каждый элемент плана, добавить его в массив, а затем добавить массив на верхний уровень. Пожаловаться:

db.collection("Feedback_Message").getDocuments() { documentSnapshot, error in
            if let documentSnapshot = documentSnapshot {
                for document in documentSnapshot.documents {
                    guard let planDetails = document.get("planDetails") as? [[String : Any]],
                        let email = document.get("E-mail") as? String,
                        let status = document.get("status") as? Bool else {
                            continue
                        }

                    for plan in planDetails {
                        guard let menuItemName = plan["menuItemName"] as? String,
                        let menuItemQuantity = plan["menuItemQuantity"] as? Int else {
                                continue
                        }
                        let singlePlan = PlanDetails(menuItemName: menuItemName, menuItemQuantity: menuItemQuantity)
                        self.planDetailsArray.append(singlePlan)
                    }
                    let complain = Complain(eMail: email, status: status, planDetails: self.planDetailsArray)
                    self.planDetailsArray.removeAll()
                    self.messageArray.append(complain)
                }
            }
            // Print the main array or load table
            }
        }

ответ bsod остается правильным, потому что без его помощи я бы не получил смог прийти к его выводу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...