2015-12-15 114 views
0

我有一個通用協議,它有一個返回通用參數的方法。協議有兩種實現方式,都將字符串作爲返回類型。我想要一種方法來構建一個類似於基於某個參數的類集羣的特定實例。該方法限制了泛型類型,但有試圖返回時的錯誤:返回專用類型的通用協議swift的方法

「不能類型StringReturn返回表達式轉換成返回類型T」

protocol GenericProtocol { 

    typealias ReturnType 

    func doSomething() -> ReturnType 

} 

struct StringReturn : GenericProtocol { 

    func doSomething() -> String { 
     return "first" 
    } 

} 

struct AnotherStringReturn : GenericProtocol { 

    func doSomething() -> String { 
     return "another" 
    } 

} 

func build<T : GenericProtocol where T.ReturnType == String>(param: String) -> T { 

    if .. { 
     return StringReturn() 
    } else { 
     return AnotherStringReturn 
    } 

} 

回答

1

你所想要實現使用泛型函數使用Swift的Type Constraints來創建一個對象的實例。

注意從蘋果公司的文件的一般語法:

func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) { 
    // function body goes here 
} 

在你工作,這是不可能的,在函數執行的時間來推斷是什麼類型的T因爲你沒有把它傳遞給該函數作爲參數,因此您不能說輸出是什麼類型。

如果你想使用的類型約束的通用功能,你可以添加一些init到您的協議,並使用這樣的函數:

func build<T : GenericProtocol where T.ReturnType == String>(object: T.Type, param: String) -> T { 
    // Your code here 
    return T.init() 
} 

let str = build(StringReturn.self, param: "name") 

希望它能幫助!

+0

嗨,這很好,但我想要的功能來決定什麼T結束了,這可能嗎? –

+0

@LukeDeFeo如果你想基於某些條件返回一個對象,我想你可以使用'GenericProtocol'的常規函數​​作爲返回類型。問題是你的協議有一個相關的類型'ReturnType',它不可能用它作爲返回類型。 –

+0

是的,所以我不會能夠返回通用協議,因爲它具有自我要求,它只能用作通用約束。很煩人,我發現通用協議幾乎是無用的:/ –

相關問題