无法调用'下标'错误

时间:2015-02-26 23:45:06

标签: ios swift swap

我正在尝试使用从this blog借来的函数。这是函数:

func shuffleArray<T>(array: Array<T>) -> Array<T>
{
    for var index = array.count - 1; index > 0; index--
    {
        // Random int from 0 to index-1
        var j = Int(arc4random_uniform(UInt32(index-1)))

        // Swap two array elements
        // Notice '&' required as swap uses 'inout' parameters
        swap(&array[index], &array[j])
    }
    return array
}

但是,当我尝试声明它时,我在交换行上出现错误 - 无法使用类型为'的参数列表调用'下标'(inout in $ T6,inout in $ T11)'。

导致错误的原因是什么?

1 个答案:

答案 0 :(得分:0)

函数shuffleArray的第一个参数必须是inout参数:

func shuffleArray<T>(inout array: Array<T>)

inout参数表示变量是通过引用而不是值传递的。换句话说,函数shuffleArray正在对基础对象array进行更改,而不是对其进行更改。也就是说,你可以删除shuffleArray的返回值,因为通过引用传递的变量,无论你传入什么,都会被函数变异。

你的最终功能应该是这样的:

func shuffleArray<T>(inout array: Array<T>)
{
    for var index = array.count - 1; index > 0; index--
    {
        var j = Int(arc4random_uniform(UInt32(index-1)))
        swap(&array[index], &array[j])
    }
}

现在,当您将数组传入函数时,请使用&语法。

func shuffleArray(&array)

编辑:您还可以将第一个参数声明为变量并保留返回值:

func shuffleArray(var array: Array<T>) -> Array<T>