如何修复Swift中修改字典值时的‘mutating operator isn't mutable’错误?
问题解决:Swift字典修改值时出现
mutating operator isn't mutable错误 错误原因
你遍历字典时拿到的num是字典元素的不可变副本(Swift默认用let绑定遍历得到的值类型),所以无法直接对它执行加减操作;退一步说,就算能修改,也只是改了副本,原字典不会有任何变化,完全达不到更新数据的目的。
修复方案
不需要遍历整个字典,直接通过键名访问字典的对应值进行修改,这样操作的是原字典里的元素:
增加计数的函数
func addOneItem(itemName: String) { // 用default处理键不存在的情况,默认值设为0,直接加1 currCleanup.items_collected[itemName, default: 0] += 1 db.collection("Cleanups").document(currCleanup.username).updateData(["itemsCollected": currCleanup.items_collected]) }
减少计数的函数
func delOneItem(itemName: String) { // 先判断键是否存在且计数大于0 guard let currentCount = currCleanup.items_collected[itemName], currentCount > 0 else { return } let newCount = currentCount - 1 if newCount == 0 { // 计数为0时可以移除该键,避免字典里留0值的键 currCleanup.items_collected.removeValue(forKey: itemName) } else { currCleanup.items_collected[itemName] = newCount } db.collection("Cleanups").document(currCleanup.username).updateData(["itemsCollected": currCleanup.items_collected]) }
额外说明
如果Cleanup是结构体(struct),因为结构体是值类型,修改它的属性时需要确保currCleanup是可变的(你的代码里已经用@Published var声明,所以没问题);如果是类(class),则不需要额外考虑可变性,直接修改属性即可。
内容的提问来源于stack exchange,提问作者Terri Tai
相关产品推荐
相关产品推荐

