带块内赋值的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