You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中Switch语句Integer类型nil值引发崩溃的解决方法问询

解决Integer强制解包导致的崩溃问题

你的崩溃根源在于两处强制解包:carMpass.text! 和 Int(...)! —— 当carMpass.text为空,或者文本内容无法转换成有效整数时,这两个!都会直接触发运行时崩溃。下面是几种安全的修复方案,从简单到严谨逐步优化:

方案1:用可选绑定安全解析数值

先通过可选绑定确认carMpass.text存在,再尝试将其转为Int,只有解析成功后才执行后续逻辑:

@IBAction func calc(_ sender: UIButton) {
    // 安全获取并转换年份数值,失败则提示并退出
    guard let yearText = carMpass.text, let statusCode = Int(yearText) else {
        result.text = "请输入有效年份"
        return
    }
    
    // 安全获取另外两个文本字段的可选值
    let carType = carTpass.text
    let carModel = carCompass.text
    
    switch (carType, carModel, statusCode) {
    case ("BMW", "X", 2008 ... 2010):
        result.text = "Yes"
    default:
        result.text = "No"
    }
}

方案2:添加输入范围校验(更严谨)

如果想提前过滤不合理的年份输入,可以在解析时增加范围判断,让提示更精准:

@IBAction func calc(_ sender: UIButton) {
    let currentYear = Calendar.current.component(.year, from: Date())
    guard let yearText = carMpass.text, 
          let statusCode = Int(yearText),
          statusCode >= 1900 && statusCode <= currentYear else {
        result.text = "请输入有效的年份(1900-当前年份)"
        return
    }
    
    let carType = carTpass.text
    let carModel = carCompass.text
    
    switch (carType, carModel, statusCode) {
    case ("BMW", "X", 2008 ... 2010):
        result.text = "Yes"
    default:
        result.text = "No"
    }
}

额外优化:简化UserDefaults取值逻辑

你之前的UserDefaults取值代码可以简化成更简洁安全的写法,避免重复的类型转换:

carTpass.text = UserDefaults.standard.string(forKey: "carT")
carMpass.text = UserDefaults.standard.string(forKey: "carM")
carCompass.text = UserDefaults.standard.string(forKey: "carCom")

直接用string(forKey:)会自动返回可选字符串,赋值给text属性(本身也是可选类型)时无需额外解包,更简洁安全。

内容的提问来源于stack exchange,提问作者Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:38:56