有没有办法覆盖Swift数组的Copy on Write行为?

时间:2017-07-14 18:01:17

标签: swift

我正在开发一个需要使用大型数组的项目,并且通过使用UnsafeMutablePointers,我使用常规数组方法的速度提高了三倍。但是,我认为写行为的副本导致我改变了我不想受影响的实例。例如,在以下代码中,我想更新copyArray中的值,但将原始值保留在anArray中。

import Foundation

func increaseWithPointers(_ arr: inout [Int]) {
    let count = arr.count
    let ptr = UnsafeMutablePointer(mutating: &arr)
    for i in 0..<count {
        ptr[i] = ptr[i] + 1
    }
}

var anArray = [1,2,3,4,5]
var copyArray = anArray

increaseWithPointers(&copyArray)
print(anArray)

执行此代码会打印[2,3,4,5,6]。

我可以通过声明copyArray来解决这个问题:

var copyArray = [Int](repeating: 0, count: 5)
for i in 0..<5 {
    copyArray[i] = anArray[i]
}

但是,这需要将每个值写入两次:为零,然后为预期值。有没有办法有效地保证数组的副本?

1 个答案:

答案 0 :(得分:1)

我可以使用Xcode 9 beta 3重现您的问题,但不能使用Xcode 8.3.3。我建议您提交Swift bug report

这解决了问题:

import Foundation

func increaseWithPointers(_ arr: inout [Int]) {
    arr.withUnsafeMutableBufferPointer { (buffer) in
        for i in buffer.indices {
            buffer[i] += 1
        }
    }
}

var anArray = [1,2,3,4,5]
var copyArray = anArray

increaseWithPointers(&copyArray)
print(anArray)