Swift:使用泛型函数和约束

时间:2016-03-13 19:39:36

标签: swift generics inout

我在Swift中迈出了第一步,并且遇到了第一个问题。我试图在带有约束的泛型函数上使用inout通过引用传递数组。

首先,我的应用程序起点:

import Foundation

let sort = Sort()
sort.sort(["A", "B", "C", "D"])

在这里我的班级有实际问题:

import Foundation

class Sort {
    func sort<T:Comparable>(items:[T]){
        let startIndex = 0
        let minIndex = 1
        exchange(&items, firstIndex: startIndex, secondIndex: minIndex)
    }

    func exchange<T:Comparable>(inout array:[T], firstIndex:Int, secondIndex:Int) {
        // do something with the array
    }
}

我在调用exchange的行上的Xcode中收到以下错误:

Cannot convert value of type '[T]' to expected argument type '[_]'

我在这里错过了什么吗?

更新:添加了完整的项目代码。

2 个答案:

答案 0 :(得分:3)

它适用于以下修改:

  • 传入它的数组必须是var。 As mentioned in the documentation,不得泄露或文字。

      

    您不能传递常量或文字值作为参数,因为不能修改常量和文字。

  • 声明中的项目也必须是inout以表明它必须再次为var

import Foundation


class Sort {
    func sort<T:Comparable>(inout items:[T]){
        let startIndex = 0
        let minIndex = 1
        exchange(&items, firstIndex: startIndex, secondIndex: minIndex)
    }

    func exchange<T:Comparable>(inout array:[T], firstIndex:Int, secondIndex:Int) {
        // do something with the array
    }
}


let sort = Sort()
var array = ["A", "B", "C", "D"]
sort.sort(&array)

答案 1 :(得分:-3)

您可以使用swift swap函数“交换”数组中的两个值。

e.g。

var a = [1, 2, 3, 4, 5]
swap(&a[0], &a[1])

意味着a现在是[2,1,3,4,5]