Возможно ли иметь массив [String: Any] в документе Firestore? - PullRequest
0 голосов
/ 31 октября 2019

Я столкнулся с проблемой, когда я получаю ошибку SIGABRT с таким названием:

Could not cast value of type '__NSDictionaryM' (0x7fff87afce38) to 'NSArray' (0x7fff87afb628)

По сути, я пытался получить список задач из моего Firestoreбаза данных. База данных структурирована следующим образом:

lists {
    <autoID from Firebase> {
        "name": String
        "users": [String]
        "tasks": [
                     ["name": String,            // This is the first task in the array
                      "description": String,
                      "due": Date
                      "delegate": Int
                      "status": Bool
                     ]
                     ["name": String,            // This is the second task in the array
                      "description": String,
                      "due": Date
                      "delegate": Int
                      "status": Bool
                     ]
                 ]
        "completed": [[]]                       // Possible to have the same structure as "tasks"?
    }
}

В моем коде я создал запрос, который пытается отфильтровать имя списка и UID пользователя. Однако при попытке сохранить tasks в переменной возникает SIGABRT с указанием вышеуказанной проблемы. Вот мой код:

struct Task {

    var name: String
    var description: String
    var due: Date
    var delegate: Int
    var status: Bool

}
let listsReference = Firestore.firestore().collection("lists")
listsReference.whereField("users", arrayContains: uid).addSnapshotListener { (snapshot, error) in

if let error = error {              
    // Error exists. errorAlert is created, prompting the user to attempt refreshing their app to load once again.

    let errorAlert = UIAlertController(title: "An error occurred.", message: error.localizedDescription, preferredStyle: .alert)
    errorAlert.addAction(UIAlertAction(title: "OK", style: .default, handler: { (_) in }))
    self.present(errorAlert, animated: true, completion: nil)

    } else {
        for document in snapshot!.documents {    

            let data = document.data()

            if data["name"] as! String == self.titleName {

                let tasks = data["tasks"] as! [NSDictionary]            // SIGABRT error occurs here.

                self.listField.text = (data["name"] as! String)
                self.documentID = document.documentID

                for task in tasks {

                    let date = task.value(forKey: "due") as! Timestamp
                    self.dateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss +zzzz"
                    self.dateFormatter.locale = Locale.init(identifier: "en_GB")
                    self.dateFormatter.dateFormat = "dd MMM yyyy"

                    self.tasks.append(Task(name: task.value(forKey: "name") as! String, description: task.value(forKey: "description") as! String, due: date.dateValue(), delegate: task.value(forKey: "delegate") as! Int, status: task.value(forKey: "status") as! Bool))
                    self.tasksTable.reloadData()

            }

        }

    }

}

Что я могу сделать, чтобы обойти эту проблему? Кроме того, есть ли какие-либо оптимизации, которые я могу внести в эту структуру (поскольку мне нужно будет найти способ добавить этот массив tasks в базу данных). Кто-нибудь знает, как обновить массив tasks в будущем?

Буду признателен за любую помощь. Спасибо!

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