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
相关产品推荐
相关产品推荐

