我正在从事一个需要处理大型数组的项目,通过使用 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(©Array)
print(anArray)
执行此代码会打印 [2,3,4,5,6]。
我可以通过如下声明 copyArray 来解决这个问题:
var copyArray = [Int](repeating: 0, count: 5)
for i in 0..<5 {
copyArray[i] = anArray[i]
}
但是,这需要将每个值写入两次:写入零,然后写入预期值。有没有办法有效地保证数组的副本?
最佳答案
我可以使用 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(©Array)
print(anArray)
关于swift - 有没有办法覆盖 Swift 数组的写入时复制行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45109161/