如何修复我的代码中的“重叠访问‘self’,但修改需要独占访问;考虑复制到局部变量”错误?

Lov*_*röm 4 xcode ios swift xcode10 swift4.2

我无法继续使用我的应用程序,也无法测试运行它,因为我的代码中有问题,我不知道如何修复!这是代码:

import Foundation

extension Array {
    mutating func shuffle() {
        if count < 2 { return }
        for i in 0..<(count - 1) {
            let j = Int(arc4random_uniform(UInt32(count - i))) + i 
            customSwap(a: &self[i], b: &self[j])
        }
    }
}

func customSwap<T>(a:inout T, b:inout T) {
    let temp = a
    a = b
    b = temp
}
Run Code Online (Sandbox Code Playgroud)

vac*_*ama 5

问题在于数组是一种值类型,当您修改一个元素时,您会更改整个数组。所以你的调用customSwap()传递了对整个数组的两个引用,这会导致对 self错误的重叠访问

相反,您可以写入customSwap()以获取要交换的数组和索引的一份副本:

func customSwap<T>(_ array: inout [T], _ a: Int, _ b: Int) {
    let temp = array[a]
    array[a] = array[b]
    array[b] = temp
}
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

customSwap(&self, i, j)
Run Code Online (Sandbox Code Playgroud)

但是你不必这样做,因为Array有一个swapAt(_:_)像这样的内置定义:

 mutating func swapAt(_ i: Int, _ j: Int)
Run Code Online (Sandbox Code Playgroud)

所以你可以用以下方法替换你的customSwap电话:

self.swapAt(i, j)
Run Code Online (Sandbox Code Playgroud)

但是Array有一个内置的shuffle(),你可以调用而不是自己实现它。