Я делаю это приложение, идея которого заключается в том, что вы создаете профиль, добавляете своих собак, а затем обновляете таймер для них (когда они в последний раз ели, гуляли и т. д.). Однако у меня есть некоторые проблемы с Firebase. Мне удалось заставить пользователя добавить собак в свою учетную запись, но теперь, когда я пытаюсь обновить некоторые значения для определенной собаки, приложение вылетает с ошибкой «Неожиданно найдено нулевое значение при развертывании необязательного значения», которое, похоже, связано с Firebase. Моя база данных содержит пользователя, его собак и набор значений собак, таких как firstTimer. Когда я пытаюсь обновить это значение с помощью метода setData(), он просто продолжает падать, и в моей базе данных ничего не отображается. я также пытался обновить значения по отдельности, но безрезультатно. Пожалуйста, скажите мне, если я делаю это неправильно, и если есть какой-то другой подход, который можно попробовать, спасибо!
import Foundation
import Firebase
import UIKit
//DogViewController
class MyDogViewController: UIViewController {
var db: Firestore!
var auth: Auth!
var storage: Storage!
var thisDog: DogEntry?
var dogRef: DocumentReference!
override func viewDidLoad() {
thisDog?.firstTimer = (formattedDate)
if let dog = thisDog?.toAny() {
print("Let")
//THE PROGRAM PRINTS LET
dogRef.setData(dog)
//BUT CRASHES HERE
}
else {
print("Error")
}
}
}
}
//Dog Modal Class
class DogEntry {
var name: String
var image: String
var firstTimer: String
var secondTimer: String
var walking: Bool = false
var walkArray: [String]
var id: String = ""
init(name: String, image: String, firstTimer: String, secondTimer: String, walking: Bool, walkArray: [String]) {
self.name = name
self.image = image
self.firstTimer = firstTimer
self.secondTimer = secondTimer
self.walking = walking
self.walkArray = walkArray
}
init(snapshot: QueryDocumentSnapshot) {
let snapshotValue = snapshot.data() as [String : Any]
name = snapshotValue["name"] as! String
image = snapshotValue["image"] as! String
firstTimer = snapshotValue["firstTimer"] as! String
secondTimer = snapshotValue["secondTimer"] as! String
walking = snapshotValue["walking"] as! Bool
walkArray = snapshotValue["walkArray"] as! [String]
id = snapshot.documentID
}
func toAny() -> [String: Any] {
return ["name": name, "image": image, "firstTimer": firstTimer, "secondTimer": secondTimer, "walking": walking, "walkArray": walkArray]
}
}
Я знаю значение nil и знаю, что из-за него программа вылетает. Чего я не понимаю, так это почему программа вообще возвращает nil и что мне с этим делать. Спасибо!
Видимо у нас разные представления о "знать"..
Видимо так. Спасибо за ваш вклад
Ни одна из ваших переменных не инициализирована, по крайней мере, во фрагменте, который вы даете. Вы только что дали им типы. Например, dogRef буквально говорит, что dogRef имеет тип DocumentReference и должен существовать. Но нигде в вашем коде вы не присваиваете значение переменной. Наверняка рухнет. Инициализируйте свою переменную правильно. Что-то вроде dogRef = Firestore.firestore().collection(“the collection”).document(“the document”).....
thisDog?.firstTimer = (formattedDate)
также приведет к нулевой собаке, поскольку объект собаки не инициализирован. Непонятно, почему «LET» будет печататься так, если оператор завершится ошибкой (в моем проекте это не удается). Возможно, есть дополнительный код, который инициализирует объект собаки?
Ваш dogRef
является неявно развернутым необязательным. Вы должны дать ему значение, прежде чем вызывать его.
Итак, есть
nil
, когда требуется не-nil
(подсказка: поиск, чтобы узнать, что означает ошибка).. тогда вернитесь к исходной строке ошибки/вводу и определите, почему существует ошибка между ожиданиями и фактическим значением. Это действительно не относится к «базам данных» или «firebase» и т. д.