2015-11-05 101 views
0

我有以下相當簡單雨燕2.0的代碼斯威夫特協議如何才能符合類型參數協議

protocol PA { 
    init(handle:Int) 
} 

class CB: PA { 
    required init(handle:Int) {} 
} 

class X { 
    func test<U:PA>() -> U { 
     return U(handle: 1) 
    } 
} 

class ThisFails { 
    func foo() -> PA { 
     return X().test() 
    } 
} 

但它失敗,很奇怪的錯誤消息編譯

swift:23:20: error: generic parameter 'U' could not be inferred return X().test()

我想ü推斷爲PA類型

將方法foo的返回類型更改爲CB使其正常工作,但我有許多類實現PA協議,因此不會爲我工作。

類似地從U刪除PA約束:PA和編譯器推斷它在foo內部爲PA類型,但是我需要在test內部調用約束,這樣也不會幫助我。

+0

這是'正常'。測試() - > U是帶有返回U類型實例的U類型參數的函數.foo返回類型是PA.Type,不是符合PA的類型,如U:PA。換句話說,從protocol.Type創建一個實例是不可能的。嘗試讓a = Any()。它也不可用。 – user3441734

回答

0

那麼......這個問題在錯誤信息中說得很清楚! 要點是你聲明瞭一個使用泛型的函數,泛型對協議有一個約束。然後使用泛型U ...寫入方法test(),這意味着當您真正使用該方法時,編譯器必須清楚符合要實例化並由test()返回的協議PA的實際類型是什麼。 在函數foo中,這個不清楚......當它從未被提及時,你怎麼能期望測試返回CB?嘗試:

X().test<CB>() 
+0

錯誤... return X()。test ()should not works。你不能明確地專門化一個通用函數 – user3441734

+0

你不能明確地專門化Swift中的通用函數 –

+0

我的不好...抱歉! – Freedom

0
class ThisFails { 
    func foo() -> PA { 
     return X().test() // error: generic parameter 'U' could not be inferred 
    } 
} 

X().test() as PA   // error: generic parameter 'U' could not be inferred 

檢查下一行

X().test()  // error: generic parameter 'U' could not be inferred 
X().test() as CB // no error 

的問題是如何使不明類型的實例。編譯器知道的一點是,類型應該符合協議。它不夠,是嗎?

tryclass ThisFails { 
    func foo<U:PA>() -> U { 
     return X().test() 
    } 
} 
相關問題