带块内赋值的Swift forEach

带块内赋值的Swift forEach,swift,struct,foreach,copy-on-write,Swift,Struct,Foreach,Copy On Write,假设我有这个 var array = [1,2,3] array.forEach { array.append(17) print($0) } 它不会永远循环,而是打印1、2和3,之后数组有6个元素:[1、2、3、17、17] 这是怎样理解的呢 块中的数组是我调用.append(17)时数组的副本,对吗?然后在循环之后,它被分配给数组变量?或者复印件是手工制作的 这实际上是怎么回事 这: 或者这个: var array = [1,2,3] var arrayCopy = ar

假设我有这个

var array = [1,2,3]

array.forEach {
    array.append(17)
    print($0)
}
它不会永远循环,而是打印1、2和3,之后数组有6个元素:[1、2、3、17、17]

这是怎样理解的呢

块中的数组是我调用
.append(17)
时数组的副本,对吗?然后在循环之后,它被分配给数组变量?或者复印件是手工制作的

这实际上是怎么回事

这:

或者这个:

var array = [1,2,3]
var arrayCopy = array

arrayCopy.forEach {
    array.append(17)
    print($0)
}

还是别的什么?

有趣的观察。当创建forEach时,第二个答案看起来更准确。当前数组的副本被创建并循环通过它的元素

var array = [1,2,3]
var arrayCopy = array

arrayCopy.forEach {
    array.append(17)
    print($0)
}
若你们在操场上运行下面的代码,你们将得到输出,显示每个循环中添加到主数组中的元素

var array = [1,2,3]

array.forEach {_ in
    array.append(17)
    print(array)
}


//You will get following output 
//[1, 2, 3, 17]
//[1, 2, 3, 17, 17]
//[1, 2, 3, 17, 17, 17]

第一个是准确的,工作正常,但您必须将
arrayCopy
初始化为空数组,如下所示:

var array = [1,2,3]
var arrayCopy: [Int] = []

array.forEach {
    arrayCopy.append(17)
    print($0)
}

array = arrayCopy

这将为您提供与您已将输出添加到阵列中相同的输出,但只有当您想复制并将其放入原始阵列中时,这才有效。

不,对不起,我不想写它,我的意思是我想了解引擎盖下发生了什么。“它不会永远循环”-这是一件非常好的事情。
var array = [1,2,3]
var arrayCopy: [Int] = []

array.forEach {
    arrayCopy.append(17)
    print($0)
}

array = arrayCopy