Если происходит сбой
let city = docData!["city"] as! String
, это означает, что узел не содержит дочерний элемент 'city'.Возможно, он полностью отсутствует, или вместо города есть Город.
Принудительное развертывание переменной (например, как!), Которая потенциально может быть равна нулю, по сути означает «Эй, вар, вы никогда не будете равны нулю» и может привести к сбою приложения.и нестабильность.
Лучший способ справиться с этим и защитить свой код - правильно обрабатывать данные в тех случаях, когда они могут отличаться от ожидаемых.
Лучший способ - использовать объединение нулейнапример, это обеспечивает значение по умолчанию, если city равен nil
let city = data!["city"] as? String ?? "no city selected"
или если вы хотите работать с nil, измените способ чтения дочерних узлов на
let city = document.get("city")
Помня о том, что хотя этот код не будет аварийно завершаться, city может быть нулевым в этой ситуации, поэтому вам необходимо соответствующим образом обработать это в коде, следующем за этим оператором.
Вы также можете использоватьПозвольте заявления
var aPlace = PlaceStruct()
if let city = document.get("city") as? String {
aPlace.city = city
} else {
aPlace.city = "Hometown"
}
или защитные заявления для защиты ваших данных.
Независимо от ситуации, не заставляйте развернуть потенциально ноль переменных, если вы не знаете, что они будут никогда не быть ноль - обрабатывать те переменные, которые могут быть ноль изящно.