【问题标题】:Why do I get an error when attempting to invoke indexOf on a generic ArraySlice?尝试在泛型 ArraySlice 上调用 indexOf 时,为什么会出现错误?
【发布时间】:2016-01-24 15:55:37
【问题描述】:

以下函数在 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 兼容。

【问题讨论】:

    标签: swift generics


    【解决方案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
    }
    

    【讨论】:

    • 哦...当然!谢谢你。错误信息让我很困惑。
    • 错误信息在 Swift 2.2 中有所改进:swiftlang.ng.bluemix.net/#/repl/…
    • 既然你指出了,我想返回类型应该是Array&lt;T&gt;.Index?而不是Int
    • 不需要那么乱!您的函数是数组元素的通用函数,而不是集合的类型。数组使用Int 作为它们的索引类型,所以返回它是可以的(而且更简单)。 (而且+ 1 也比.successor() 更容易阅读。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多