Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения: файл - PullRequest
0 голосов
/ 02 марта 2020

все, что я пытаюсь сделать, это загрузить данные моего Firestore в мой просмотр таблицы

func loaddailymotivation() {

    FirebaseReferece(.MotivationDAILY).getDocuments { (snapshot, error) in

        if let error = error {
            print("error getting MOTIVATIONDAILY DATA \(error.localizedDescription)")
        }

        else {

            guard let snapshot = snapshot else { return }

        for allDocument in snapshot.documents {

                let data = allDocument.data()

                print("\(allDocument.documentID) => \(allDocument.data())")

                print("we have\(snapshot.documents.count) documents in this array")

                let dailymotivationTitle = data["Motivation title"] as? String
                let dailyMotivationScripture = data["motivation scripture"] as? String

            let newthought = RealMotivatioNDataModel(Realmotivation: dailymotivationTitle!, RealmotivationScrip: dailyMotivationScripture!)

            //self.motivationArray.append(newthought)

              }
            self.tableview.reloadData()

        }
    }

}

не слишком уверен, почему мое приложение продолжает падать, сообщая о фатальной ошибке: неожиданно развертывание необязательного значения: файл im собирается загрузить скриншот для получения дополнительной информации

import Foundation
 import UIKit


 class RealMotivatioNDataModel {

var RealmotivationTitle : String!

var realmotivationDailyScripture : String!

init(Realmotivation : String, RealmotivationScrip : String) {


    self.realmotivationDailyScripture = Realmotivation

    self.RealmotivationTitle = RealmotivationScrip
}
}

это ошибка, которую я получаю

Ответы [ 3 ]

0 голосов
/ 02 марта 2020

Только не используйте принудительное развертывание !, потому что dailymotivationTitle или dailyMotivationScripture может быть nil, а причина в том, что (Key может быть не выход или это значение ключа не String)

 let dailymotivationTitle = data["Motivation title"] as? String
 let dailyMotivationScripture = data["motivation scripture"] as? String

Вы можете использовать if let или guard else

guard  let dailymotivationTitle = data["Motivation title"] as? String,
       let dailyMotivationScripture = data["motivation scripture"] as? String
       else { return }

И RealMotivatioNDataModel будет таким

  let newthought = RealMotivatioNDataModel(Realmotivation: dailymotivationTitle, RealmotivationScrip: dailyMotivationScripture)
0 голосов
/ 02 марта 2020

Хотя другие ответы, как правило, правильные о том, как предотвратить сбой вашего кода, они не объясняют почему вы получаете cra * sh, потому что ваша переменная равна нулю.

Здесь происходит то, что код перебирает все документы, содержащиеся в снимке

for allDocument in snapshot.documents {

, и следующая строка пытается прочитать поле под названием «Заголовок мотивации» в каждом документе. То как? сообщает вашему коду, что если поле не существует, присвойте переменной var dailymotivationTitle значение nil (? означает, что он необязательный; он может существовать или не существовать)

let dailymotivationTitle = data["Motivation title"] as? String

, а вот пример то, как может выглядеть ваша структура, может привести к тому, что cra sh:

document_0
   Motivation title = "Some title"
   motivation scripture "Some scripture"
document_1
   Motivation title = "Some title"
   motivation scripture "Some scripture"
document_2
   Motivation Title = "Some title"
   motivation scripture "Some scripture"

все go будет хорошо при чтении document_0 и document_1, но обратите внимание, что document_2 случайно имеет немного другое имя поля: Мотивация Title (обратите внимание на заглавную букву T в заголовке), и это не то, что ожидает приложение. Таким образом, переменная dailymotivationTitle имеет значение nil, как упомянуто выше.

В дальнейшем это поле может вообще не существовать в одном документе в структуре, что является тем же результатом; nil var.

Тогда эта строка является виновником, потому что она разворачивает этот необязательный var с!

let newthought = RealMotivatioNDataModel(Realmotivation: dailymotivationTitle!

The! следуя за dailymotivationTitle var, ваш код сообщает, что вы ГАРАНТИРУЕТЕ, что оно не будет равно нулю. Но ... это было ... так что это дает сбой.

Так что прыгайте в консоль Firebase и просматривайте структуру - вы обнаружите, что либо в одном документе есть поле, написанное по-другому, либо это поле полностью отсутствует (или что-то еще, но это с чего начать)

0 голосов
/ 02 марта 2020

Причина:

Исключением является то, что вы пытаетесь принудительно развернуть значение nil.

Решение :

Используйте if-let для безопасного развертывания optional значений.

if let dailymotivationTitle = data["Motivation title"] as? String, let dailyMotivationScripture = data["motivation scripture"] as? String {
    let newthought = RealMotivatioNDataModel(Realmotivation: dailymotivationTitle, RealmotivationScrip: dailyMotivationScripture)
    //add your code here...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...