2015-11-24 57 views
4

試圖創建一個通用數據源我遇到了這個錯誤,我想知道爲什麼這不是可編譯的。無法在通用實現中將[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 
    } 
} 
+0

協議真的不能通用。這是關聯類型('typealias')的全部要點。 Swift在協議中的泛型類型'T'和'IntDataSource'後的''之間不會看到連接。我不確定爲什麼在協議聲明中甚至允許使用'',儘管在協議中使用泛型是沒有意義的。 – Sulthan

+0

是的,一個協議不能是通用的,但它似乎內部的函數可能是...也爲什麼這意味着[Int]不能被識別爲[Int]這只是一個錯誤的編譯器錯誤信息? – Moriya

+0

'return [Int]()'被接受,有些東西不對,但是什麼? –

回答

6

的 「奇怪」 的編譯器錯誤

Cannot convert return expression of type '[Int]' to return type '[Int]' 

可以作如下解釋:

博特中的H類定義的<Int>和在該方法中定義的<Int> 引入稱爲Int一個新的通用 類型的佔位符(並因此外<Int>隱藏全局類型具有相同的名稱,並且內<Int>隱藏 外的一個)。您的類定義等同於

class IntDataSource<A>: DataSource { 
    let data:[A] = [] 
    func getData<B>() -> [B] { 
     return data 
    } 
} 

而現在的編譯器錯誤是可以理解的:

cannot convert return expression of type '[A]' to return type '[B]' 
+0

實際上是否有一種有效的方法在方法上使用帶泛型類型的協議?我找不到一個。 – Sulthan

+1

@Sulthan:類中的通用方法'func getData () - > [T] {return []}'會滿足協議。但是這不是很有用,因爲'T'與課堂中使用的任何具體類型無關。 –

+0

@MartinR是的,這是我發現的問題。即使使用'where A == B',我也無法編譯它。 – Sulthan