if 语句或意外的 nil,同时解包错误;不确定哪个
if statement or unexpected nil while unwrapping error; unsure of which
*快速说明,图片将有助于解释我的情况。所以目前,我只是添加了精液。学分和 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不用管,执行my语句的top部分,如果不为空则执行else语句。
所以我的问题...如果我为每个字段输入一个值,那么所有内容都没有问题。但是,如果我离开 Cum。学分或 GPA 字段为空,我的程序崩溃,我得到典型的 "unexpectedly found nil while unwrapping an Optional value" 处理
let CCredits = Float(CumCredits.text!)!
let CGPA = Float(CumGPA.text!)!
我已经尝试了很多可能的解决方案:重写代码和重新措辞代码,但我似乎无法理解。你能提出什么建议?
如有任何帮助,我们将不胜感激!
尝试强制解包可选时会发生此错误,因此请先查看每个“!”使用过,你可能会发现其中一个是零。
编辑
在查看并讨论评论后,您的 if 语句似乎应该是
!CumCredits.characters.isEmpty || !CumGPA.characters.isEmpty
在这种情况下可能发生的情况是您的字段中的值为空字符串,因此尝试从条目字符串创建浮点数将导致 nil 值。
一个解决方案是在函数顶部放置一个 guard 语句,这样导致错误的代码永远不会是 运行:
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*
问题出在 if - 语句上。
I should have had CumCredits.text == "" || CumGPA.text == ""
这样一来,如果我的文本字段为空,它们将跳过我代码的第一部分。
*快速说明,图片将有助于解释我的情况。所以目前,我只是添加了精液。学分和 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不用管,执行my语句的top部分,如果不为空则执行else语句。
所以我的问题...如果我为每个字段输入一个值,那么所有内容都没有问题。但是,如果我离开 Cum。学分或 GPA 字段为空,我的程序崩溃,我得到典型的 "unexpectedly found nil while unwrapping an Optional value" 处理
let CCredits = Float(CumCredits.text!)!
let CGPA = Float(CumGPA.text!)!
我已经尝试了很多可能的解决方案:重写代码和重新措辞代码,但我似乎无法理解。你能提出什么建议?
如有任何帮助,我们将不胜感激!
尝试强制解包可选时会发生此错误,因此请先查看每个“!”使用过,你可能会发现其中一个是零。
编辑 在查看并讨论评论后,您的 if 语句似乎应该是
!CumCredits.characters.isEmpty || !CumGPA.characters.isEmpty
在这种情况下可能发生的情况是您的字段中的值为空字符串,因此尝试从条目字符串创建浮点数将导致 nil 值。
一个解决方案是在函数顶部放置一个 guard 语句,这样导致错误的代码永远不会是 运行:
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*
问题出在 if - 语句上。
I should have had CumCredits.text == "" || CumGPA.text == ""
这样一来,如果我的文本字段为空,它们将跳过我代码的第一部分。