Я столкнулся с проблемой, когда я получаю ошибку 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
в будущем?
Буду признателен за любую помощь. Спасибо!