此函数适用于Xcode6的早期版本(以array: T[]
作为声明)。
func shuffle<T>(array: [T]) -> Void {
for i in 0..<(array.count - 1) {
let j = Int(arc4random_uniform(UInt32(array.count - i))) + i
let tmp = array[i]
array[i] = array[j]
array[j] = tmp
}
}
在测试版4下,它现在告诉我最后两个作业的左值与T
不同。我在这里缺少什么?
答案 0 :(得分:2)
问题是Array已更改为真正的值类型。这意味着它在被分配给新变量或传递给方法时总是被复制。您正在尝试修改该副本,该副本最终不会执行任何操作,因此编译器会通过使array
不可变来阻止您。
要解决此问题,您可以将array
定义为inout paramater:
func shuffle<T>(inout array: [T]) -> Void {
注意:然后,您需要在将数组传递到shuffle &
之前放置shuffle(&anArray)
但您可能需要考虑让您的函数返回一个新副本:
func shuffle<T>(var array: [T]) -> [T] {
这将允许它安全地在多线程环境中工作,并允许将Optionals传递给您的函数。