基于通用的功能不再有效

时间:2014-07-24 18:05:06

标签: generics swift

此函数适用于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不同。我在这里缺少什么?

1 个答案:

答案 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传递给您的函数。