Swift错误“[T]不是”的子类型

时间:2014-07-16 16:03:53

标签: swift generics

使用Swift教程遇到一些麻烦...

func exchange<T>(inout data:[T], i:Int, j:Int)
{
    let temp = data[i];
    data[i] = data[j];
    data[j] = temp;
}

func swapLeft<T: Comparable>(data: [T], index:Int)
{
    for i in reverse(1...index)
    {
        if (data[i] < data[i - 1])
        {
            exchange(&data, i, i - 1);
        }
        else
        {
            break;
        }
    }
}

var data = [Int]();
data = [84, 0, 1, 63, 20, 12, 11, 63, 13, 99, 89, 98, 94, 31, 88, 48, 90, 30, 68, 43];
swapLeft(data, 6);
data

swapLeft中,交换呼叫产生错误:

  

游乐场执行失败:错误:: 32:13:错误:'[T]'不是'@lvalue $ T3'的子类型

我有一个模糊的假设,那是因为swapLeft使用了Comparable泛型,但是交换使用了非Comparable。但是将交换更改为func exchange<T: Comparable>...不会修复它。有谁知道该怎么做?

1 个答案:

答案 0 :(得分:3)

您的问题仍然是inout。您的swapLeft函数缺少inout说明符:

func swapLeft<T: Comparable>(inout data: [T], index:Int)

当你调用它时,你必须对数组进行解除分配:

swapLeft(&data, 6);