尝试在通用ArraySlice上调用indexOf时,为什么会出现错误?

时间:2016-01-24 07:20:06

标签: swift generics

以下函数在Array of 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
}

但是,当我尝试创建此函数的通用版本以查找第二个Equatable项时,我收到错误:

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
}

为什么这不是有效的Swift代码,如果不是(T),那么预期的参数列表是什么? Xcode自动填充功能会显示indexOf(element: Comparable)T兼容的<?php foreach( $projects as $key => $project ){ $class=( $current_project==$project['id'] ) ? " class='active'" : ''; echo " <li{$class}> <a href='".$base_url . config_item('language_abbr')."/".$project['id']."/admin/galerias'>".$project['nombre']."</a> </li>"; } ?>

1 个答案:

答案 0 :(得分:1)

编译器在这里给你一个令人困惑的错误信息 - 它实际上并不关心这个参数。返回值是问题的根源,因为您没有返回类型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
}