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)
问题在于数组是一种值类型,当您修改一个元素时,您会更改整个数组。所以你的调用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(_:_)像这样的内置定义:
Run Code Online (Sandbox Code Playgroud)mutating func swapAt(_ i: Int, _ j: Int)
所以你可以用以下方法替换你的customSwap电话:
self.swapAt(i, j)
Run Code Online (Sandbox Code Playgroud)
但是Array有一个内置的shuffle(),你可以调用而不是自己实现它。
| 归档时间: |
|
| 查看次数: |
1858 次 |
| 最近记录: |