ios - 如何修复 "Overlapping accesses to ' self',但修改需要独占访问;考虑在我的代码中复制到局部变量“错误?

标签 ios swift xcode 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
}

最佳答案

问题在于数组是一种值类型,当您修改一个元素时,您会更改整个数组。因此,您对 customSwap() 的调用传递了对整个数组的两个引用,这会导致 overlapping accesses to self 错误。

相反,您可以编写 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()你可以直接调用而不是自己实现它。

关于ios - 如何修复 "Overlapping accesses to ' self',但修改需要独占访问;考虑在我的代码中复制到局部变量“错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54030090/

相关文章:

ios - 如何检查collectionview是否为空xcode

xcode - 我如何使用 Github 从以前的项目中创建一个完全独立的项目?

ios - APNS(苹果推送通知服务)可靠性

ios - 如何在 swift 中为每个循环添加新行?

ios - 无法将数据转换为字符周围的字符串

swift - 添加游戏中心排行榜

swift - 单击按钮时无法加载 WebView

ios - 如何将 UIBezierPath 带到 MKAnnotation 对象的后面?

swift - 强制SDK仅支持一种语言

objective-c - tableview 的问题