无法在 Swift 的 for 循环中更改数组元素的值
Not able to change the value of element of array in for-loop in Swift
我想将 1 添加到当前迭代旁边的数组值中。
虽然最终结果是正确的,但如果我们看到 print(item) 结果,它仍然打印旧值。
var arr3 = [1,2,3]
for (index,item) in arr3.enumerated() {
if index+1 == arr3.count {
// Do nothing
} else {
arr3[index + 1] = arr3[index+1] + 1
}
print(item)
}
print(arr3)
结果:
1
2
3
[1,3,4]
预期:
1
3
4
[1,3,4]
这怎么可能?
您可能希望使用 enumerated()
的循环与在 indices
上循环并具有 let item = arr3[index]
:
的行为相同
for index in arr3.indices {
let item = arr3[index]
print(item)
if index+1 != arr3.count {
arr3[index + 1] += 1
}
}
然而,事实并非如此。 enumerated()
产生一个 EnumeratedSequence<[Int]>
。 (参见 EnumeratedSequence
and enumerated()
的源代码)。要创建一个 EnumeratedSequence
,将原始数组 arr3
传递给它的初始化程序:
public func enumerated() -> EnumeratedSequence<Self> {
return EnumeratedSequence(_base: self)
}
如您所知,Array
是 (copy-on-write) 值类型。当您在循环中修改 arr3
时,将创建一个修改后的副本并将其分配给 arr3
,并且 EnumeratedSequence
拥有的数组(即循环迭代的数组)是不受影响。 enumerated()
是在您调用它时创建数组的“快照”,因此所有 print(item)
只会打印旧项目。
我想将 1 添加到当前迭代旁边的数组值中。 虽然最终结果是正确的,但如果我们看到 print(item) 结果,它仍然打印旧值。
var arr3 = [1,2,3]
for (index,item) in arr3.enumerated() {
if index+1 == arr3.count {
// Do nothing
} else {
arr3[index + 1] = arr3[index+1] + 1
}
print(item)
}
print(arr3)
结果:
1
2
3
[1,3,4]
预期:
1
3
4
[1,3,4]
这怎么可能?
您可能希望使用 enumerated()
的循环与在 indices
上循环并具有 let item = arr3[index]
:
for index in arr3.indices {
let item = arr3[index]
print(item)
if index+1 != arr3.count {
arr3[index + 1] += 1
}
}
然而,事实并非如此。 enumerated()
产生一个 EnumeratedSequence<[Int]>
。 (参见 EnumeratedSequence
and enumerated()
的源代码)。要创建一个 EnumeratedSequence
,将原始数组 arr3
传递给它的初始化程序:
public func enumerated() -> EnumeratedSequence<Self> {
return EnumeratedSequence(_base: self)
}
如您所知,Array
是 (copy-on-write) 值类型。当您在循环中修改 arr3
时,将创建一个修改后的副本并将其分配给 arr3
,并且 EnumeratedSequence
拥有的数组(即循环迭代的数组)是不受影响。 enumerated()
是在您调用它时创建数组的“快照”,因此所有 print(item)
只会打印旧项目。