我正在开发一个需要使用大型数组的项目,并且通过使用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]
}
但是,这需要将每个值写入两次:为零,然后为预期值。有没有办法有效地保证数组的副本?
答案 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(©Array)
print(anArray)