gpt4 book ai didi

swift - 有没有办法覆盖 Swift 数组的写入时复制行为?

转载 作者:行者123 更新时间:2023-11-28 06:16:02 25 4
gpt4 key购买 nike

我正在从事一个需要处理大型数组的项目,通过使用 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]
}

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

最佳答案

我可以使用 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)

关于swift - 有没有办法覆盖 Swift 数组的写入时复制行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45109161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com