for ... in 循环是否循环遍历序列的副本?

Mic*_*May 0 arrays loops for-in-loop swift

我在 Matt Neuburg 的《iOS 13 Swift 编程基础》中看到了如下的陈述:

\n
\n

当您使用 for...in 循环访问序列时,您实际循环访问的是该序列的副本。这意味着当你循环遍历序列时,改变序列是安全的:

\n
\n

作者为上述陈述提供了以下示例:

\n
var s : Set = [1,2,3,4,5]\nfor i in s {\n    if i.isMultiple(of:2) {\n        s.remove(i)\n    }\n} // s is now [1,3,5]\n
Run Code Online (Sandbox Code Playgroud)\n

在上面的示例中,我们可以看到原始数组从 [1,2,3,4,5,6] 更改为 [1,3,5]。这意味着数组本身已更改。因此,for in循环不是循环原始数组的副本,而是循环数组本身。这似乎与作者上述的说法相矛盾。

\n

所以,我不确定作者的说法是否属实。有人可以澄清一下这个问题吗?非常感谢。

\n

Dáv*_*tor 5

乍一看,措辞可能有点误导,但for i in s循环遍历原始副本的陈述s是正确的。如果不是这样,您将得到越界异常或意外结果(集合的某些元素被跳过),因为您在迭代集合时会改变集合。

当您使用 创建循环时for i in s,将创建 的副本s,并通过该副本进行迭代。但是,当您访问s循环体内部时,您正在访问原始内容s并因此对其进行更改,而不是更改循环正在迭代的副本。