Swift字典可选值累加使用??结果异常,不强制解包如何解决?
问题根因
报错和结果不符合预期分别由两个不同问题导致:
- 直接编写
bookQty["Ride"] = bookQty["Science"] + data[i]报错:Swift字典通过key取值返回的是可选类型,Double?无法直接和非可选的Double执行算术运算,必须先完成解包。 - 改用
??后结果异常:原因是运算符优先级问题,??的优先级低于+,你编写的bookQty["Science"] ?? 0 + data[i]实际执行逻辑为:- 优先计算
0 + data[i] - 判断
bookQty["Science"]是否为nil,非nil直接返回原有值,为nil才返回第一步的计算结果 - 仅第一次循环时
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
相关产品推荐
相关产品推荐

