試圖創建一個通用數據源我遇到了這個錯誤,我想知道爲什麼這不是可編譯的。無法在通用實現中將[Int]轉換爲[Int]
錯誤:
無法將類型的返回表達式 '[INT]' 返回類型 '[INT]'
的代碼:
protocol DataSource {
func getData<T>() -> [T]
}
class IntDataSource<Int>: DataSource {
let data:[Int] = []
func getData<Int>() -> [Int] {
return data
}
}
的引發錯誤在IntDataSource的return語句中。
我知道這可能會用更好的方式來完成與
typealias DataType
var data: DataType? { get }
但我感興趣的主要是爲什麼編譯器不希望接受return語句。有任何想法嗎?
編輯:
問題的部分也是爲什麼如果前面的代碼不是編譯如下公平的遊戲?
class IntDataSource<Int>: DataSource {
func getData<Int>() -> [Int] {
let data:[Int] = []
return data
}
}
編輯2:
這個版本也編譯沒有問題
class IntDataSource<Int>: DataSource {
func getData<Int>() -> [Int] {
return getIntData()
}
func getIntData<Int>() -> [Int] {
let data:[Int] = []
return data
}
}
協議真的不能通用。這是關聯類型('typealias')的全部要點。 Swift在協議中的泛型類型'T'和'IntDataSource'後的''之間不會看到連接。我不確定爲什麼在協議聲明中甚至允許使用'',儘管在協議中使用泛型是沒有意義的。 –
Sulthan
是的,一個協議不能是通用的,但它似乎內部的函數可能是...也爲什麼這意味着[Int]不能被識別爲[Int]這只是一個錯誤的編譯器錯誤信息? – Moriya
'return [Int]()'被接受,有些東西不對,但是什麼? –