在不断变化的集合中使用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部分也没有解决这个问题。所以:

  1. 我可以安全地依赖语言规范中提供的有关此迭代行为的保证吗?
  2. 或者我只是幸运地使用了当前版本的 Swift 5.4?在这种情况下,语言规范中是否有任何不能想当然的线索?与索引迭代相比,此迭代行为(例如某些副本)是否存在性能开销?
以上是在不断变化的集合中使用for..in进行迭代的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>