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

标签 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]
}

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

最佳答案

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

相关文章:

iphone - iOS 收到无效响应中的 AdMob 原生高级广告

ios - Swift 4 Split View Controller Detail 替换 Master

ios - 如果 UIButton 的大小是一定大小,如何更改它的大小

swift - Swift 和可变数据中的初始化

swift spritekit : How to stop a runBlock?

ios - 使用swift语言更改按钮背景颜色

ViewController 的快速可重用性

ios - 在显示 UIContextMenu 时从 UICollectionView 中删除项目时出现奇怪的动画

swift - 未执行 bpm 代码的点击按钮

swift - 使用自定义动画显示和隐藏按钮