Swift 为什么在尝试调用泛型ArraySlice上的indexOf时出错?

Swift 为什么在尝试调用泛型ArraySlice上的indexOf时出错?,swift,generics,Swift,Generics,以下函数在Int数组中查找给定项的第二个索引: func secondIndexOf(item: Int, inArray array: Array<Int>) -> Int? { if let firstIndex: Int = array.indexOf(item) { let slice: ArraySlice<Int> = array.suffixFrom(firstIndex + 1) return slice.in

以下函数在Int数组中查找给定项的第二个索引:

func secondIndexOf(item: Int, inArray array: Array<Int>) -> Int? {
    if let firstIndex: Int = array.indexOf(item) {
        let slice: ArraySlice<Int> = array.suffixFrom(firstIndex + 1)
        return slice.indexOf(item)
    }
    return nil
}
func secondIndexOf(项:Int,数组:数组)->Int?{
如果let firstIndex:Int=array.indexOf(项){
let slice:ArraySlice=array.suffixFrom(firstIndex+1)
返回slice.indexOf(项)
}
归零
}
但是,当我尝试创建此函数的通用版本以查找第二个可等分项时,出现了一个错误:

func secondIndexOf<T: Equatable>(item: T, inArray array: Array<T>) -> T? {
    if let firstIndex: Int = array.indexOf(item) {
        let slice: ArraySlice<T> = array.suffixFrom(firstIndex + 1)
        return slice.indexOf(item) // Cannot invoke 'indexOf' with an argument list of type '(T)'
    }
    return nil
}
func secondIndexOf(项:T,数组:数组)->T?{
如果let firstIndex:Int=array.indexOf(项){
let slice:ArraySlice=array.suffixFrom(firstIndex+1)
return slice.indexOf(item)//无法使用类型为“(T)”的参数列表调用“indexOf”
}
归零
}

为什么这不是有效的Swift代码,如果不是
(T)
,预期的参数列表是什么?Xcode autocomplete显示
indexOf(element:Comparable)
,其中
T
应该与之兼容。

编译器在这里给您一条令人困惑的错误消息,它实际上并不关心参数。返回值是问题的根源,因为返回的不是
t
类型的值,而是数组的索引。您只需将返回类型更改为
Int?

func secondIndexOf<T: Equatable>(item: T, inArray array: Array<T>) -> Int? {
    if let firstIndex: Int = array.indexOf(item) {
        let slice: ArraySlice<T> = array.suffixFrom(firstIndex + 1)
        return slice.indexOf(item)
    }
    return nil
}
func secondIndexOf(项:T,数组:数组)->Int?{
如果let firstIndex:Int=array.indexOf(项){
let slice:ArraySlice=array.suffixFrom(firstIndex+1)
返回slice.indexOf(项)
}
归零
}

哦。。。当然非常感谢。这个错误消息把我弄糊涂了。Swift 2.2中的错误消息有了一点改进:现在您指出了它,我想返回类型应该是
Array.Index?
而不是
Int
。不需要那样混乱!您的函数是数组元素的泛型函数,而不是集合类型。数组使用
Int
作为其索引类型,因此返回该类型是可以的(而且更简单)。(而且
+1
.succession()
更容易阅读。)