ios - if 语句或展开错误时出现意外的 nil;不确定哪个

标签 ios swift if-statement textbox option-type

*快速说明,图片将有助于解释我的情况。所以现在,我只添加精液。我的 GPA 计算器应用程序中的学分和 GPA 文本字段。这两个字段是可选的,而下面的其他 4 个字段不是可选的。这是我的大部分代码(请暂时原谅冗余)。

         if CumCredits == "" || CumGPA == ""
        {
            let credit1 = Float(Credits1TF.text!)!
            let credit2 = Float(Credits2TF.text!)!

            let grade1 = Float(Grade1TF.text!)!
            let grade2 = Float(Grade2TF.text!)!

            let firstgrade = credit1 * grade1
            let secondgrade = credit2 * grade2

            let allcredits = credit1 + credit2
            let allgrades = firstgrade + secondgrade

            let finalgrade = round((allgrades / allcredits) * 10000)/10000


            GPALabel.text = "Your Semester GPA is: \(finalgrade)"
            GPALabel.hidden = false

            Class1TF.resignFirstResponder()
            Class2TF.resignFirstResponder()
            Credits1TF.resignFirstResponder()
            Credits2TF.resignFirstResponder()
            Grade1TF.resignFirstResponder()
            Grade2TF.resignFirstResponder()


            }
            else {
            let credit1 = Float(Credits1TF.text!)!
            let credit2 = Float(Credits2TF.text!)!

            let grade1 = Float(Grade1TF.text!)!
            let grade2 = Float(Grade2TF.text!)!

            let firstgrade = credit1 * grade1
            let secondgrade = credit2 * grade2

            let allcredits = credit1 + credit2
            let allgrades = firstgrade + secondgrade

            let finalgrade = round((allgrades / allcredits) * 10000)/10000

            Class1TF.resignFirstResponder()
            Class2TF.resignFirstResponder()
            Credits1TF.resignFirstResponder()
            Credits2TF.resignFirstResponder()
            Grade1TF.resignFirstResponder()
            Grade2TF.resignFirstResponder()
            CumCredits.resignFirstResponder()
            CumGPA.resignFirstResponder()

            let CCredits = Float(CumCredits.text!)!
            let CGPA = Float(CumGPA.text!)!

            //top math
            let LastGrade = CCredits * CGPA
            let MegaCredits = allcredits + CCredits
            let MegaGPA = allgrades + LastGrade
            let MegaEverything = (round((MegaGPA / MegaCredits) * 10000)/10000) - 0.0001

            CumTotal.hidden = false
            CumTotal.text = "Your expected cumulative GPA is: \(MegaEverything)"
            GPALabel.text = "Your Semester GPA is: \(finalgrade)"
            GPALabel.hidden = false

            Class1TF.resignFirstResponder()
            Class2TF.resignFirstResponder()
            Credits1TF.resignFirstResponder()
            Credits2TF.resignFirstResponder()
            Grade1TF.resignFirstResponder()
            Grade2TF.resignFirstResponder()
            CumCredits.resignFirstResponder()
            CumGPA.resignFirstResponder()

        }

目前(据我所知),如果射精了。学分和 GPA 保持不变,执行我的语句的顶部部分,如果它们不为空,则执行 else 语句。

所以我的问题...如果我为每个字段输入一个值,那么一切都没有问题。但是,如果我留下任何一个暨。学分或 GPA 字段为空,我的程序崩溃,并且我得到典型的“在展开可选值时意外发现 nil”,处理任一

 let CCredits = Float(CumCredits.text!)!
 let CGPA = Float(CumGPA.text!)!

我尝试了许多可能的解决方案:重新编写代码和重新措辞代码,但我似乎无法得到它。您能提出什么建议?

如有任何帮助,我们将不胜感激!

enter image description here

最佳答案

尝试强制解包可选内容时会发生此错误,因此首先查看每个“!”使用过,您可能会发现其中之一为零。

编辑 经过查看并在评论中讨论后,看来您的 if 语句应该是

!CumCredits.characters.isEmpty || !CumGPA.characters.isEmpty

在这种情况下可能发生的情况是字段中的值是空字符串,因此尝试从条目字符串创建 float 将导致 nil 值。

一种解决方案是在函数顶部放置一个保护语句,这样导致错误的代码就永远不会运行:

guard let credits1Text = Credits1TF.text, 
          credits2Text = Credits2TF.text, 
          grade1Text = Grade1TF.text, 
          grade2Text = Grad2TF.text
where !credits1Text.characters.isEmpty && !credits2Text.characters.isEmpty 
     && !grade1Text.characters.isEmpty && !grade2Text.characters.isEmpty else {
   *handle case where float conversion won't work*
}
*continue on with normal code, using verified values created in guard*

关于ios - if 语句或展开错误时出现意外的 nil;不确定哪个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35885938/

相关文章:

ios - 如何将 NSURL session 进度添加到 TableView 单元格

ios - 通过 JustWorks 绑定(bind)在 iPhone 和 iPad 之间进行 BLE 连接

ios - VKSdk 如何在 Swift 中设置委托(delegate)?

swift - 为什么我从将弱 self 传递到静态函数的闭包中得到一个保留周期?

jquery - 在javascript中计算以克服垂直对齐:middle

c - 我正在创建一个简单的程序来计算涉及 if/else 的销售总额并不断收到错误消息

c - 'if' 之前的预期表达式

ios removeAllAnimations 不工作

swift - 使用 Firebase 事务 block Swift

ios - Apple 开发人员为每个应用提供一个 app_id/provisioning?