2016-01-24 22 views
2

下面的函數找到在Int的陣列某一項目的第二個指標:爲什麼在嘗試調用通用ArraySlice的indexOf時會出錯?

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 
} 

爲什麼這不是有效的銀行代碼,什麼是預期的參數列表,如果不是(T)? Xcode自動完成顯示indexOf(element: Comparable),其中T應該兼容。

回答

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 
} 
+0

哦......當然了!謝謝。錯誤消息讓我困惑。 – titaniumdecoy

+0

這個錯誤信息在Swift 2.2中有所改進:http://swiftlang.ng.bluemix.net/#/repl/ef45c06738a7fddb48e6b3e6e97d409945d3e84d7e3befac7cf6034678baefd0 –

+0

現在你指出了,我想返回類型應該是'Array 。索引?'而不是'Int'。 – titaniumdecoy

相關問題