无法在 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) 只会打印旧项目。