"If" 语句不适用于可选值
"If" statement not working with optional value
我的问题是我有一些用户输入数字的文本字段,然后输入的数字被保存到相应的变量中。
但是,如果用户未输入数字并将其留空,则文本字段的值为 'nil',因此在展开时会崩溃。
所以我使用 if 语句仅在测试字段的内容不为零时才解包,但这不起作用。我的程序仍然解包并崩溃,因为值为 nil...
我不明白我的 if 语句怎么没有捕捉到这个。
另一方面,如何更改我的 if 语句以仅允许解包和存储 Int 值,忽略字符串或其他任何内容。
@IBAction func UpdateSettings() {
if CriticalRaindays.text != nil {
crit_raindays = CriticalRaindays.text.toInt()!
}
if EvapLess.text != nil {
et_raindays_lessthan_11 = EvapLess.text.toInt()!
}
if EvapMore.text != nil {
et_raindays_morethan_11 = EvapMore.text.toInt()!
}
if MaxWaterStorage.text != nil {
max_h2Ostore = MaxWaterStorage.text.toInt()!
}
if CarryForward.text != nil {
carry_forward = CarryForward.text.toInt()!
}
}
在你的 ViewDidLoad
中,设置 CarryForward.text = ""
这样它就永远不会为 nil
编辑:
要检查文本字段是否为空,您可以使用:
if (CarryForward.text.isEmpty) {
value = 10
}
else {
value = CarryForward.text
}
如果文本字段的文本不是零,为什么不使用 if let
展开?
if let textString = self.textField.text as String! {
// do something with textString, we know it contains a value
}
您的问题是,虽然文本存在,但并不意味着 toInt()
会 return 一个值。
假设文本是 abc
,CriticalRaindays.text != nil
会成立,但 CriticalRaindays.text.toInt()!
仍然可以是 nil
,因为 abc
无法转换为 Int .
您崩溃的确切原因可能是 .text
等于 ""
,空字符串。它不是 nil
,但也绝对不是 Int
。
更好的解决方案是使用可选绑定来检查整数转换并查看是否通过,而不仅仅是现有的字符串:
if let rainDays = CriticalRaindays.text.toInt() {
crit_raindays = rainDays
}
如果无法编译,您可能需要进行可选链接:
if let rainDays = CriticalRaindays.text?.toInt()
不在 Mac 自动取款机上,所以无法为您测试,但希望这是有意义的!
我的问题是我有一些用户输入数字的文本字段,然后输入的数字被保存到相应的变量中。
但是,如果用户未输入数字并将其留空,则文本字段的值为 'nil',因此在展开时会崩溃。
所以我使用 if 语句仅在测试字段的内容不为零时才解包,但这不起作用。我的程序仍然解包并崩溃,因为值为 nil...
我不明白我的 if 语句怎么没有捕捉到这个。
另一方面,如何更改我的 if 语句以仅允许解包和存储 Int 值,忽略字符串或其他任何内容。
@IBAction func UpdateSettings() {
if CriticalRaindays.text != nil {
crit_raindays = CriticalRaindays.text.toInt()!
}
if EvapLess.text != nil {
et_raindays_lessthan_11 = EvapLess.text.toInt()!
}
if EvapMore.text != nil {
et_raindays_morethan_11 = EvapMore.text.toInt()!
}
if MaxWaterStorage.text != nil {
max_h2Ostore = MaxWaterStorage.text.toInt()!
}
if CarryForward.text != nil {
carry_forward = CarryForward.text.toInt()!
}
}
在你的 ViewDidLoad
中,设置 CarryForward.text = ""
这样它就永远不会为 nil
编辑:
要检查文本字段是否为空,您可以使用:
if (CarryForward.text.isEmpty) {
value = 10
}
else {
value = CarryForward.text
}
如果文本字段的文本不是零,为什么不使用 if let
展开?
if let textString = self.textField.text as String! {
// do something with textString, we know it contains a value
}
您的问题是,虽然文本存在,但并不意味着 toInt()
会 return 一个值。
假设文本是 abc
,CriticalRaindays.text != nil
会成立,但 CriticalRaindays.text.toInt()!
仍然可以是 nil
,因为 abc
无法转换为 Int .
您崩溃的确切原因可能是 .text
等于 ""
,空字符串。它不是 nil
,但也绝对不是 Int
。
更好的解决方案是使用可选绑定来检查整数转换并查看是否通过,而不仅仅是现有的字符串:
if let rainDays = CriticalRaindays.text.toInt() {
crit_raindays = rainDays
}
如果无法编译,您可能需要进行可选链接:
if let rainDays = CriticalRaindays.text?.toInt()
不在 Mac 自动取款机上,所以无法为您测试,但希望这是有意义的!