我的问题是我有一些用户输入数字的文本字段,然后输入的数字被保存到相应的变量中。
但是,如果用户没有输入数字并将其留空,则文本字段的值为“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()!
}
}
最佳答案
您的问题是,虽然文本存在,但这并不意味着 toInt()
将返回一个值。
假设文本是 abc
,CriticalRaindays.text != nil
会是 true 但 CriticalRaindays.text.toInt()!
仍然可以为 nil
,因为 abc
无法转换为 Int。
导致崩溃的确切原因可能是 .text
等于 ""
,即空字符串。它不是 nil
,但也绝对不是 Int
。
更好的解决方案是使用可选绑定(bind)来检查整数转换并查看是否通过,而不仅仅是现有的字符串:
if let rainDays = CriticalRaindays.text.toInt() {
crit_raindays = rainDays
}
如果不能编译,您可能需要进行可选链接:
if let rainDays = CriticalRaindays.text?.toInt()
不是在 Mac atm 上,所以无法为您测试,但希望这是有意义的!
关于swift - "If"语句不适用于可选值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31993551/