У меня есть несколько строк и 2 массива, хранящихся в Firestore, и теперь я пытаюсь их получить, но понятия не имею, как это сделать. Ну, строки работают нормально, но я не знаю, как я могу запросить массивы. Я получаю код ошибки:
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
И вот мой код:
//For-loop
for document in QuerySnapshot!.documents
{
self.list.removeAll()
//let document = QuerySnapshot!.documents
let data = document.data()
let data1 = data["Dog"] as? String
let data2 = data["Person"] as? String
let data3 = data["What"] as? String
let data4 = data["Time"] as? String
let data5 = data["Date"] as? String
let data6 = data["Kilometers"] as? String
let data7 = data["Timer"] as? String
let data8 = data["Latitude"] as? Array<Double>
let data9 = data["Longitude"] as? Array<Double>
let txt = listTxt(dog: data1!, person: data2!, action: data3!, time: data4!, date: data5!, kilometers: data6!, timer: data7!, latitude: data8 ?? [], longitude: data9 ?? [])
print(txt)
tempTxt.append(txt)
}
self.list = tempTxt
self.tableView.reloadData()
}
Массивы хранятся как Двойной, и смысл в том, чтобы получить его как двойник и снова преобразовать в CLLocationCoordinate2D, чтобы я мог использовать координаты для карты. Если вы знаете, как решить эту проблему, пожалуйста, дайте мне знать. :)
Внутри класса:
class listTxt
{
var dog: String
var person: String
var action: String
var time: String
var date: String
var kilometers: String
var timer: String
var latitude: [String]
var longitude: [String]
init(dog: String, person: String, action: String, time: String, date: String, kilometers: String, timer: String, latitude: [String], longitude: [String])
{
self.dog = dog
self.person = person
self.action = action
self.time = time
self.date = date
self.kilometers = kilometers
self.timer = timer
self.latitude = latitude
self.longitude = longitude
}
Внутри ячейки истории
class HistoryCell: UITableViewCell
{
@IBOutlet weak var DogName: UILabel!
@IBOutlet weak var Person: UILabel!
@IBOutlet weak var Action: UILabel!
@IBOutlet weak var Date: UILabel!
@IBOutlet weak var Time: UILabel!
@IBOutlet weak var timer: UILabel!
@IBOutlet weak var kilometer: UILabel!
var latitude: [String] = []
var longitude: [String] = []
func setCell(list: listTxt)
{
DogName.text = list.dog
Person.text = list.person
Action.text = list.action
Date.text = list.date
Time.text = list.time
timer.text = list.timer
kilometer.text = list.kilometers
latitude = list.latitude
longitude = list.longitude
}
}
Заранее спасибо. :)
@Saurabh Вы имеете в виду, что я должен использовать «as? String» вместо Double? И чем его конвертировать в Int, а из int в Double? :)
Нет, это не сработает, так как вы можете получить строковое значение с десятичным числом. Поправьте меня, если я ошибаюсь.
@Saurabh Да, это CLLocationCoordinate2D с самого начала. Который я преобразовал, чтобы вставить данные в Firestore
Ну, вы можете получить пустые строки или значения nil, и если вы попытаетесь привести их к Double, вы получите ошибку. Поэтому перед приведением проверьте, не являются ли значения пустыми или нулевыми.
Содержит ли вывод данных документа какой-либо ключ со значением null/nil? Если да, обратитесь к этому вопросу stackoverflow.com/questions/37606376/…
@Saurabh, я проверю, подожди
@Saurabh imgur.com/a/zP6S6uL Это результат атм.
почему вы передаете широту и долготу в Array<Double>?
Я изменил его обратно на [Double], и в конце концов я добавил print(data8 ?? 0.0), чтобы попробовать, но все они возвращают 0,0, и по крайней мере у одного из них широта и долгота не равны 0.
хорошо... попробуйте сохранить его без квадратных скобок как Double
какой тип значения вы получаете для ключей широты и долготы, это строка или массив?
@Saurabh Вы имеете в виду, когда я сохраняю его в Firestore?
Нет при извлечении из Firestore
Вы можете поделиться данными, которые вы извлекаете из firestore?
@Saurabh EDIT: о, проверьте редактирование ветки
Вы пробовали использовать [String] вместо [Double]?
Проверьте редактирование в моей теме, может быть, где-то еще не так
В обоих классах нет проблем. Можете ли вы показать вывод, который вы получите после печати document.data() в вашей консоли?
замените обе клавиши Широта на широту и Долгота на долготу в коде
@Saurabh imgur.com/a/b7YtAcF <-- Вот это
Проверьте мой ответ @PrezyProgramming





Вы пробовали, как показано ниже?
let data8 = data["latitude"] as? [Double]
let data9 = data["longitude"] as? [Double]
На самом деле вы получаете доступ к данным с неправильными ключами... «широта», «долгота» являются допустимыми ключами, но вы получаете «Широту», «Долготу», которых нет в вашем снимке данных.
Примечание Убедитесь, что при сохранении данных вы отправляете их в виде массива двойных значений.
Это когда я сохраняю это: `var latitudes:[Double] = [] var longitudes:[Double] = []` Я попробую то, что вы сказали, но я думаю, что уже пробовал это:/
так что вы сохраняете пустой массив двойных?
также, пожалуйста, покажите мне словарь данных, который вы сохраняете.
Ну, сначала у меня это. (При первом просмотре, когда я сохраняю его в Firestore) var locations: [CLLocationCoordinate2D] = [] var latitudes:[Double] = [] var longitudes:[Double] = [] ViewDidLoad() { latitudes = locations.map({ $0.latitude }) longitudes = locations.map({ $0.longitude }) } SaveToFireStore() { //A lot of code before this, but nothing that includes lat and long. "latitude": latitudes, "longitude": longitudes ] }
проверьте отредактированный ответ, на самом деле вы получаете доступ к данным с неправильными ключами ... "широта", "долгота" являются допустимыми ключами, но вы извлекаете с помощью "широты", "долготы", которых нет в вашем снимке данных.
Попробуйте заменить следующие строки кода:
let data8 = data["latitude"] as? [Double]
let data9 = data["longitude"] as? [Double]
Причина: Доступ к данным с неправильными ключами
Обратитесь к этому stackoverflow.com/a/32850058/5255016