Firebase - Как мне прочитать эту карту через встроенные структуры? - PullRequest
0 голосов
/ 31 марта 2020

Я читаю данные из Firestore, чтобы иметь возможность заполнять расширяющиеся ячейки таблицы. У меня действительно простая структура:

protocol PlanSerializable {
    init?(dictionary:[String:Any])
}

struct Plan{
    var menuItemName: String
    var menuItemQuantity: Int
    var menuItemPrice: Double

    var dictionary: [String: Any] {
        return [
            "menuItemName": menuItemName,
            "menuItemQuantity": menuItemQuantity,
            "menuItemPrice": menuItemPrice
        ]
    }
}

extension Plan : PlanSerializable {
    init?(dictionary: [String : Any]) {
        guard let menuItemName = dictionary["menuItemName"] as? String,
            let menuItemQuantity = dictionary["menuItemQuantity"] as? Int,
            let menuItemPrice = dictionary["menuItemPrice"] as? Double

        else { return nil }

        self.init(menuItemName: menuItemName, menuItemQuantity: menuItemQuantity, menuItemPrice: menuItemPrice)
    }
}

И это встроено в эту структуру:

protocol ComplainSerializable {
    init?(dictionary:[String:Any])
}

struct Complain{
    var status: Bool
    var header: String
    var message: String
    var timeStamp: Timestamp
    var email: String
    var planDetails: Plan

    var dictionary: [String: Any] {
        return [
            "status": status,
            "E-mail": header,
            "Message": message,
            "Time_Stamp": timeStamp,
            "User_Email": email,
            "planDetails": planDetails
        ]
    }
}

extension Complain : ComplainSerializable {
    init?(dictionary: [String : Any]) {
        guard let status = dictionary["status"] as? Bool,
            let header = dictionary["E-mail"] as? String,
            let message = dictionary["Message"] as? String,
            let timeStamp = dictionary["Time_Stamp"] as? Timestamp,
            let email = dictionary["User_Email"] as? String,
            let planDetails = dictionary["planDetails"] as? Plan

        else { return nil }

        self.init(status: status, header: header, message: message, timeStamp: timeStamp, email: email, planDetails: planDetails)
    }
}

Однако я не могу запросить какие-либо данные из Firestore, которые выглядят так: enter image description here

Вот мой запрос, хотя я просто читаю все файлы:

let db = Firestore.firestore()
var messageArray = [Complain]()

func loadMenu() {
        db.collection("Feedback_Message").getDocuments() { documentSnapshot, error in
            if let error = error {
                print("error:\(error.localizedDescription)")
            } else {
                self.messageArray = documentSnapshot!.documents.compactMap({Complain(dictionary: $0.data())})
                for plan in self.messageArray {
                    print("\(plan.email)")
                }
                DispatchQueue.main.async {
                    self.testTable.reloadData()
                }
            }
        }
    }

Что я делаю не так? РЕДАКТИРОВАТЬ : Как и предлагается, вот обновленная встроенная структура:

import Foundation

// MARK: - Complain
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
}

1 Ответ

1 голос
/ 01 апреля 2020

Используя quicktype.io, вы можете сгенерировать структуру. Оттуда все, что вам нужно сделать, это запустить этот крошечный фрагмент кода в вашем обработчике ответов.

    var compainArray = [Complain]()
func loadMenu() {
    db.collection("Feedback_Message").getDocuments() { documentSnapshot, error in
        if let error = error {
            print("error:\(error.localizedDescription)")
        } else {
            guard let snapshot = documentSnapshot else {return}

            for document in snapshot.documents {
                if let jsonData = try? JSONSerialization.data(withJSONObject: document.data()){
                    if let converted = try? JSONDecoder().decode(Complain.self, from: jsonData){
                        self.compainArray.append(converted)
                    }
                }
            }
            DispatchQueue.main.async {
                self.testTable.reloadData()
            }
        }
    }
}

, который будет обрабатывать циклы и отображение определенных переменных. Дайте мне знать, если у вас есть какие-либо проблемы с этим.

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