【问题标题】:if statement or unexpected nil while unwrapping error; unsure of whichif 语句或 unwrapping 错误时出现意外 nil;不确定哪个
【发布时间】:2016-03-09 07:56:02
【问题描述】:

*快速说明,图片将有助于解释我的情况。所以目前,我只添加 Cum。我的 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()

        }

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

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

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

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

任何帮助将不胜感激!

【问题讨论】:

    标签: ios swift if-statement textbox optional


    【解决方案1】:

    在尝试强制解包可选时会发生此错误,因此请先查看每个“!”使用过,你可能会发现其中一个是 nil。

    编辑 在 cmets 中查看并交谈后,您的 if 语句似乎应该是

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

    在这种情况下可能发生的情况是您的字段中的值是空字符串,因此尝试从输入字符串创建浮点数将导致值为 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*
    

    【讨论】:

    • 你的最后一句话……让我很感兴趣。起初我打算同意,但后来我停止了自己。目前,如果任何一个为空/nil,我的代码的第一部分就会遇到浮动/nil 困境。尽可能简单,我的 if 语句是否正确?
    • 可能是 CumCredits.text 或 CumGPA.text 为 nil。要确定,请在一行上找到字符串,然后在下一行将其转换为浮点数
    • 是的,哈哈。那是正确的代码吗?看起来这样会很好用吗?不过,我还在学习。但是,如果 CC == "" || 我可以以其他方式使用那段代码吗? CG == ""?
    • 我认为正确的方法是 !stringName.characters.isEmpty,但它应该可以工作
    • 将修复添加到答案中
    【解决方案2】:

    问题出在 if - 语句上。

    I should have had CumCredits.text == "" || CumGPA.text == ""
    

    这样,如果我的文本字段为空,它们会跳过我的代码的第一部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      相关资源
      最近更新 更多