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

如何修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 14:24:54