swift - "If"语句不适用于可选值

标签 swift uitextfield

我的问题是我有一些用户输入数字的文本字段,然后输入的数字被保存到相应的变量中。

但是,如果用户没有输入数字并将其留空,则文本字段的值为“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() 将返回一个值。

假设文本是 abcCriticalRaindays.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/

相关文章:

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

iphone - 如何在 tabBar 按钮的操作上从一个文本字段移动到下一个文本字段

ios - 检测 UITextField 内容变化

ios - 如何在mapbox ios sdk中向MGLFillStyleLayer添加线宽属性?

ios - 使用swift修改数组中的对象值

swift - SceneKit SCNPhysics车辆车轮指向车辆中心

ios - 警告 : could not load any Objective-C class information in Swift realm

iphone - 如何在 iPhone 中使用异步 Web 服务调用自动完成 TextField?

ios - 如何在警报 View 中创建两个文本字段,IOS

ios - 如何检测用户何时在 UITextField 上使用密码自动填充