[英]The operator '[]' isn't defined for the type 'Object'. Try defining the operator '[]'. Why I am getting this error in my listview builder?
[英]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.