繁体   English   中英

如何修复变异运算符不是可变错误?

[英]How do i fix mutating operator isn't mutable error?

我正在尝试修改包含字符串作为键和 integer 作为值的字典。 但是,当我尝试从 integer 中加/减 1 时,它会返回该错误。 currCleanup 是一个清理 object,它是人们可以主持的清理会话。 items_collected 是 Cleanup object 中的字典。


 @Published var firestore = Firestore.firestore()
    @Published var errorMessage: String = ""
    @Published private(set) var cleanups: [Cleanup] = []
    @Published var currCleanup: Cleanup
    
//the functions with the error
func addOneItem(itemName: String)
    {
        for (nam, num) in currCleanup.items_collected {
            if nam == itemName {
                num += 1 //this is where the error occurs
            }
        }
        db.collection("Cleanups").document(currCleanup.username).updateData(["itemsCollected" : currCleanup.items_collected])
        
}
    
func delOneItem(itemName: String)
{
    for (nam, num) in currCleanup.items_collected 
    {
        if nam == itemName {
             num -= 1 //here too
        }
    }
        
    db.collection("Cleanups").document(currCleanup.username).updateData(["itemsCollected" : currCleanup.items_collected])
}

当您迭代值对象时,您不会收到对其值的引用,而是收到新变量,值将被复制到其中。

在您的代码中, num不是对字典值的引用,而是一个全新的变量。 即使您在(nam, num)之前添加var ,它也不起作用:您只会更改变量num的值,而不是存储在字典中的值。 考虑这个例子:

var dict = ["One" : 1,
            "Two" : 2,
            "Three" : 3]

let keyToChange = "Two"
for var (key, value) in dict {
  if key == keyToChange {
    value = 4
  }
}

print(dict) // ["Two": 2, "Three": 3, "One": 1]

您需要直接访问字典值才能更改它:

var dict = ["One" : 1,
            "Two" : 2,
            "Three" : 3]

let keyToChange = "Two"
for (key, value) in dict {
  if key == keyToChange {
    dict[key] = 4
  }
}

print(dict) // ["Two": 4, "Three": 3, "One": 1]

另一方面,循环没有意义,您可以检查键是否存在并直接更改其值:

var dict = ["One" : 1,
            "Two" : 2,
            "Three" : 3]

let keyToChange = "Two"
if dict[keyToChange] != nil {
  dict[keyToChange] = 4
}

print(dict) // ["Two": 4, "One": 1, "Three": 3]

在您的代码中可能是这样的:

if let value = currCleanup.items_collected[itemName] {
  currCleanup.items_collected[itemName] = value + 1
}

而不是这个:

for (nam, num) in currCleanup.items_collected {
  if nam == itemName {
    num += 1 //this is where the error occurs
  }
}

要在给定的itemName处增加值数组,请尝试以下方法:

func addOneItem(itemName: String) {
    if currCleanup.items_collected[itemName] != nil {
        currCleanup.items_collected[itemName] = currCleanup.items_collected[itemName]! + 1
        db.collection("Cleanups").document(currCleanup.username).updateData(["itemsCollected" : currCleanup.items_collected])
    }  
}

对于delOneItem

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM