迭代Swift数组并更改值

13

我需要改变一个Swift数组的值。 我的第一次尝试是通过循环迭代来实现,但这并不起作用,因为我只得到了每个元素的副本,而且更改不会影响原始数组。 我的目标是在每个数组元素中都有一个独特的 "index"。

myArray = [["index": 0], ["index":0], ["index":0], ["index":0]]

counter = 0
for item in myArray {
  item["index"] = counter
  counter += 1
}

我的下一个尝试是使用map,但我不知道如何设置递增的值。我可以设置$0["index"] = 1,但我需要一个递增的值。

在使用map的情况下,有哪些方式可以实现这一点?

myArray.map( { $0["index"] = ...? } )

非常感谢任何帮助!


你能展示一下你用来创建数组的代码吗? - ielyamani
该数组只是一个字典列表,这些字典不是在代码中创建的,而是从文件中加载的。对于每个字典,需要添加一个非存在键“index”的值。 - Mike Nathas
请编辑您的问题,添加任何能够使您的问题在 playground 中易于理解和重现的附加信息。 - ielyamani
将原始代码中的myArray添加进去,以便可以复现。 - Mike Nathas
3个回答

17
for循环中,计数器是一个常量。要使其可变,您可以使用:

for循环中,计数器是一个常量。要使其可变,您可以使用:

for var item in myArray { ... }

但是这对我们在这里并没有帮助,因为我们会改变 item 而不是 myArray 中的元素。

你可以通过以下方式改变 myArray 中的元素:

var myArray = [["index": 0], ["index":0], ["index":0], ["index":0]]

var counter = 0

for i in myArray.indices {
    myArray[i]["index"] = counter
    counter += 1
}

print(myArray) //[["index": 0], ["index": 1], ["index": 2], ["index": 3]]

这里不需要使用counter变量:

for i in myArray.indices {
    myArray[i]["index"] = i
}
上述的函数式写法如下:
myArray.indices.forEach { myArray[$0]["index"] = $0 }

感谢使用forEach函数式编程方式,而非map函数。 - Eduard Streltsov

1
我发现了一个简单的方法,想要分享一下。
关键是定义myArray。如果按照以下方式定义,它会成功:
 let myArray : [NSMutableDictionary] = [["firstDict":1, "otherKey":1], ["secondDict":2, "otherKey":1], ["lastDict":2, "otherKey":1]]

 myArray.enumerated().forEach{$0.element["index"] = $0.offset}

 print(myArray)






 [{
firstDict = 1;
index = 0;
otherKey = 1;
 }, {
index = 1;
otherKey = 1;
secondDict = 2;
}, {
index = 2;
lastDict = 2;
otherKey = 1;
}]

0
如何采用更加函数式的方法,创建一个全新的数组来存储修改后的字典呢?
let myArray = [["index": 0], ["index":0], ["index":0], ["index":0]]
let myNewArray = myArray.enumerated().map { index, _ in ["index": index] }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接