【问题标题】:Fatal error: Unexpectedly found nil while unwrapping an Optional value: file致命错误:在展开可选值时意外发现 nil:文件
【发布时间】:2020-03-02 08:44:26
【问题描述】:

我要做的就是将我的 Firestore 数据下载到我的 tableview 上

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()

        }
    }

}

不太清楚为什么我的应用程序总是崩溃说致命错误:在展开可选值时意外发现 nil:文件我要上传屏幕截图以获取更多信息

import Foundation
 import UIKit


 class RealMotivatioNDataModel {

var RealmotivationTitle : String!

var realmotivationDailyScripture : String!

init(Realmotivation : String, RealmotivationScrip : String) {


    self.realmotivationDailyScripture = Realmotivation

    self.RealmotivationTitle = RealmotivationScrip
}
}

this is the error im receiving

【问题讨论】:

  • 您在哪一行得到异常?
  • 调试并尝试找出您的dailyMotivationTitledailyMotivationStripture 为空的原因。

标签: ios swift firebase google-cloud-firestore


【解决方案1】:

原因:

例外是因为您试图强制解包 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...
}

【讨论】:

    【解决方案2】:

    只是不要使用强制解包!,因为dailymotivationTitledailyMotivationScripture可能是nil,原因是(Key可能未退出或此键值不是String

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

    您可以使用if letguard 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)
    

    【讨论】:

      【解决方案3】:

      虽然关于如何防止代码崩溃的其他答案通常是正确的,但它们并没有解释为什么你会因为你的 var 为 nil 而崩溃。

      这里发生的是代码迭代快照中包含的所有文档

      for allDocument in snapshot.documents {
      

      下一行尝试读取每个文档中名为“动机标题”的字段。作为?告诉您的代码,如果该字段不存在,请将 var dailymotivationTitle 设置为 nil(?表示它是可选的;它可能存在也可能不存在)

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

      下面是一个示例,说明您的结构可能会导致崩溃:

      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"
      

      读取 document_0 和 document_1 时一切正常,但注意到 document_2 的字段名称意外地略有不同:Motivation Title(注意 Title 中的大写 T),这不是应用程序所期望的。因此,如上所述,dailymotivationTitle 变量设置为 nil。

      对此进行扩展,该字段可能根本不存在于结构内的一个文档中,这是相同的结果;一个零变量。

      那么这一行就是罪魁祸首,因为它用 !

      let newthought = RealMotivatioNDataModel(Realmotivation: dailymotivationTitle!
      

      !跟随dailymotivationTitle var 告诉你的代码你保证它不会是零。但是......它是......所以它崩溃了。

      因此,进入您的 Firebase 控制台并查看结构 - 您会发现一个文档的字段拼写不同,或者该字段完全丢失(或其他内容,但这是开始的地方)

      【讨论】:

        猜你喜欢
        • 2016-01-26
        • 2016-02-29
        • 2020-09-19
        • 2016-01-08
        相关资源
        最近更新 更多