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

Swift字典可选值累加使用??结果异常,不强制解包如何解决?

问题根因

报错和结果不符合预期分别由两个不同问题导致:

  • 直接编写bookQty["Ride"] = bookQty["Science"] + data[i]报错:Swift字典通过key取值返回的是可选类型,Double?无法直接和非可选的Double执行算术运算,必须先完成解包。
  • 改用??后结果异常:原因是运算符优先级问题,??的优先级低于+,你编写的bookQty["Science"] ?? 0 + data[i]实际执行逻辑为:
    1. 优先计算0 + data[i]
    2. 判断bookQty["Science"]是否为nil,非nil直接返回原有值,为nil才返回第一步的计算结果
    3. 仅第一次循环时bookQty["Science"]为nil,赋值为10.0,后续循环都直接返回已有的10.0,最终结果不符合预期。

正确实现方案

以下两种常用实现均为安全写法,无需使用强制解包:

方案1:添加括号调整运算优先级

将解包逻辑用括号包裹,保证运算顺序正确:

let data = [10.0, 20.0, 30.0, 40.0, 50.0]
var bookQty = [String : Double]()
enum activityTypeEnum : String {
  case Physics = "Physics"
  case Math = "Math"
  case Science = "Science"
  case Others = "Others"
}

for i in 0..<data.count {
    print("Data[\(i)]:\(data[i])")
    bookQty["Science"] = (bookQty["Science"] ?? 0) + data[i]
}

print("bookQty:\(bookQty)") 
// 输出:bookQty:["Science": 150.0]

方案2:使用字典带默认值的下标语法(更简洁)

Swift 字典支持[key, default: 缺省值]的下标语法,不存在对应key时直接返回设置的缺省值,返回值为非可选类型,可直接配合+=完成累加:

for i in 0..<data.count {
    print("Data[\(i)]:\(data[i])")
    bookQty["Science", default: 0.0] += data[i]
}

两种方案运行后均可得到正确的累加结果150.0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:18:02