Обновление коллекции в Firebase возвращает ошибку «при распаковке необязательного значения найдено nil»?

Я делаю это приложение, идея которого заключается в том, что вы создаете профиль, добавляете своих собак, а затем обновляете таймер для них (когда они в последний раз ели, гуляли и т. д.). Однако у меня есть некоторые проблемы с 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 (подсказка: поиск, чтобы узнать, что означает ошибка).. тогда вернитесь к исходной строке ошибки/вводу и определите, почему существует ошибка между ожиданиями и фактическим значением. Это действительно не относится к «базам данных» или «firebase» и т. д.

user2864740 05.04.2019 20:04

Я знаю значение nil и знаю, что из-за него программа вылетает. Чего я не понимаю, так это почему программа вообще возвращает nil и что мне с этим делать. Спасибо!

Kim 05.04.2019 20:06

Видимо у нас разные представления о "знать"..

user2864740 05.04.2019 20:07

Видимо так. Спасибо за ваш вклад

Kim 05.04.2019 20:08

Ни одна из ваших переменных не инициализирована, по крайней мере, во фрагменте, который вы даете. Вы только что дали им типы. Например, dogRef буквально говорит, что dogRef имеет тип DocumentReference и должен существовать. Но нигде в вашем коде вы не присваиваете значение переменной. Наверняка рухнет. Инициализируйте свою переменную правильно. Что-то вроде dogRef = Firestore.firestore().collection(“the collection”).document(“the document”).....

Galo Torres Sevilla 05.04.2019 21:03
thisDog?.firstTimer = (formattedDate) также приведет к нулевой собаке, поскольку объект собаки не инициализирован. Непонятно, почему «LET» будет печататься так, если оператор завершится ошибкой (в моем проекте это не удается). Возможно, есть дополнительный код, который инициализирует объект собаки?
Jay 05.04.2019 23:51
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
273
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш dogRef является неявно развернутым необязательным. Вы должны дать ему значение, прежде чем вызывать его.

Другие вопросы по теме