Как исправить ошибку «Перекрывающиеся доступы к« себе », но модификация требует монопольного доступа; рассмотрите возможность копирования в локальную переменную» в моем коде? - PullRequest
0 голосов
/ 04 января 2019

Я не могу продолжить работу с моим приложением и не могу выполнить его тестирование, потому что в моем коде что-то не так, и я не знаю, как это исправить!Вот код:

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
}

1 Ответ

0 голосов
/ 04 января 2019

Проблема в том, что массив является типом значения, и когда вы изменяете один элемент, вы изменяете весь массив.Таким образом, ваш вызов customSwap() передается в двух ссылках на весь массив, что приводит к перекрывающемуся доступу к self error.

Вместо этого вы можете написать customSwap(), чтобы взять одну копиюмассива и индексов, которые вы хотите поменять местами:

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

и затем назовите его так:

customSwap(&self, i, j)

Но вам не нужно этого делать, потому чтоArray имеет встроенный swapAt(_:_), определенный следующим образом:

 mutating func swapAt(_ i: Int, _ j: Int)

Таким образом, вы можете заменить свой customSwap вызов на:

self.swapAt(i, j)

Но Array имеет встроенный shuffle(), который вы можете просто вызвать вместо того, чтобы реализовать его самостоятельно.

...