在不断变化的集合中使用for..in进行迭代
我正在尝试使用循环对数组进行迭代for .. in ..。我的问题与在循环体内更改集合的情况有关。
似乎迭代是安全的,即使列表在此期间缩小。所述for迭代变量依次取的值(索引和)那些已经在循环的开始的数组中的元素,尽管在流所做的更改。例子:
var slist = [ "AA", "BC", "DE", "FG" ]
for (i, st) in slist.enumerated() { // for st in slist gives a similar result
print ("Index (i): (st)")
if st == "AA" { // at one iteration change completely the list
print (" --> check 0: (slist[0]), and 2: (slist[2])")
slist.append ("KLM")
slist.insert(st+"XX", at:0) // shift the elements in the array
slist[2]="bc" // replace some elements to come
print (" --> check again 0: (slist[0]), and 2: (slist[2])")
slist.remove(at:3)
slist.remove(at:3)
slist.remove(at:1) // makes list shorter
}
}
print (slist)
这非常有效,[ "AA", "BC", "DE", "FG" ]即使在第一次迭代后数组完全更改为对值进行迭代["AAXX", "bc", "KLM"]
我想知道我是否可以放心地依赖这种行为。不幸的是,语言指南没有说明在修改集合时迭代集合的任何信息。该for .. in部分也没有解决这个问题。所以:
- 我可以安全地依赖语言规范中提供的有关此迭代行为的保证吗?
- 或者我只是幸运地使用了当前版本的 Swift 5.4?在这种情况下,语言规范中是否有任何不能想当然的线索?与索引迭代相比,此迭代行为(例如某些副本)是否存在性能开销?