"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 一个值。

假设文本是 abcCriticalRaindays.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 自动取款机上,所以无法为您测试,但希望这是有意义的!