2016-09-21 29 views
3
的參數列表調用'methodName'

我無法獲得此編譯器的錯誤消息 「無法使用類型爲'(value:T)' 的參數列表調用'getValueType' 「如果(CMFStream.getValueType(價值:測試)=型){」無法使用類型爲

public func readArray<T>() -> Array<T> 
{ 
    // ... 
    var retval: Array<T>; 
    let test: T; 
    if (CMFStream.getValueType(value: test) != type) { 
    // ... 
    } 
} 

我想我不明白泛型和模板之間的差異

在此先感謝

回答

3

您正在傳入類型爲的對象至getValueTypeT是一個無約束的泛型類型,這意味着在編譯時它可以是範圍中已知的任何類型。它有一個明確的類型,但編譯器不知道該類型是什麼。 T是它的佔位符。

當它遇到調用getValueType並帶有類型爲T的參數的行時,它會尋找一種方法來滿足這個要求。你看到的錯誤表明它沒有找到辦法做到這一點。

這裏有一個小例子:

func foo<U>(f:U) { 
    bar(b:f) 
} 

func bar(b:Int) { 
} 

失敗的原因吧接受一個I​​nt,但富可以通過任何類型。

有兩種方法可以解決這個問題。

方法1個

製作吧通用:

func bar<V>(b:V) { 
} 

因此,如果調用

foo(f:1) 

編譯器替換UInt,創建:

func foo(f:Int) { 
    bar(b:f) 
} 

現在它需要一個接受Int酒吧,所以它取代VInt

func bar(b:Int) { 
} 

現在的類型是一致的,因此可以繼續進行。

方法2

約束U

protocol P {} 

func foo<U:P>(f:U) { 
    bar(b:f) 
} 

這就是說U是任何類型的符合協議P。所以,現在我們可以定義bar這樣的:

func bar(b:P) { 
} 

定義一個bar接受任何符合協議P

現在無論佔位U被替換,編譯器知道它符合P,它總能找到一個bar接受的東西,符合P。編譯器可以繼續。

相關問題