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

iOS计算器App重复输入小数点崩溃问题及代码求助

解决iOS计算器多小数点输入崩溃问题

问题根源

崩溃触发于displayValue的getter方法:当显示文本为"."或"1.2."这类无法转换为合法Double的字符串时,Double(displayLabel.text!)返回nil,直接触发fatalError导致崩溃。现有代码处理小数点输入时错误依赖displayValue(会触发字符串转Double操作),而非直接检查文本中是否已存在小数点。

修复步骤

1. 优化小数点输入逻辑(从源头避免非法文本)

修改numButtonPressed方法,直接检查显示文本是否包含小数点,同时修正首次点击小数点的交互(自动补0,符合计算器常规体验):

@IBAction func numButtonPressed(_ sender: UIButton) {
    guard let numValue = sender.currentTitle else { return }

    if isFinishedTypingNumber {
        if numValue == "." {
            // 首次点击小数点,显示"0."而非".",避免生成非法字符串
            displayLabel.text = "0."
        } else {
            displayLabel.text = numValue
        }
        isFinishedTypingNumber = false
    } else {
        if numValue == "." {
            // 直接检查当前文本是否已有小数点,无需触发Double转换
            if displayLabel.text?.contains(".") == true {
                return
            }
        }
        displayLabel.text = displayLabel.text! + numValue
    }
}

2. 让displayValue的getter更健壮(避免意外崩溃)

移除fatalError,处理转换失败的情况,返回默认值同时优化显示格式:

private var displayValue: Double {
    get {
        // 转换失败时返回0.0,避免崩溃
        return Double(displayLabel.text ?? "") ?? 0.0
    }
    set {
        // 优化显示:整数不显示小数点,小数保留合理位数
        let formatter = NumberFormatter()
        formatter.minimumFractionDigits = 0
        formatter.maximumFractionDigits = 16
        displayLabel.text = formatter.string(from: NSNumber(value: newValue))
    }
}

额外说明

  • 首次点击小数点自动补0,既符合用户使用习惯,又彻底避免了"."这类非法字符串的生成。
  • 检查小数点存在时直接操作字符串,绕过了可能触发崩溃的Double转换步骤。
  • 优化displayValue的setter,用NumberFormatter处理显示格式,让计算器输出更贴近日常使用的计算器样式(比如输入整数1时不会显示为1.0)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 10:00:16