2016-04-27 12 views
1

私は、プロトコルに準拠する 'ItemContainer'プロトコルとUIViewControllerサブクラス 'ItemPageController'を持っています。Swift 2.2 Generics: "ItemPageControllerFactoryタイプの戻り式をタイプTを返すように変換できません"

また、このプロトコルに準拠した 'ItemContainerControllerFactory'プロトコルと構造体もあります。

問題:適切なItemControllerControllerFactoryサブタイプを返すメソッドを作成したいとします。しかし、私は、次のコンパイラエラーを取得:

protocol ItemContainer { 
    func navigateToItem(item:Item) 
} 

class ItemPageController : UIViewController, ItemContainer { 
    func navigateToItem(item:Item) { ... } 
} 

protocol ItemContainerControllerFactory { 
    associatedtype ContainerType : UIViewController, ItemContainer 
    func itemContainerController() -> ContainerType 
} 

struct ItemPageControllerFactory: ItemContainerControllerFactory { 
    typealias ContainerType = ItemPageController 

    func itemContainerController() -> ContainerType { 
     return ContainerType() 
    } 
} 

//Goal: Be able to return different ItemContainerControllerFactory depending on some logic... (Currently hard coded to ItemPageControllerFactory) 
func itemContainerFactory<T:ItemContainerControllerFactory>() -> T {  
    return ItemPageControllerFactory() //COMPILER ERROR: "Cannot convert return expression of type ItemPageControllerFactory to return type T" 
} 

私が間違ってやっているの任意のアイデアを「型Tを返すように型ItemPageControllerFactoryのreturn式を変換できませんか」?このような

+0

変更は '(返却T'にItemPageControllerFactoryを() 'を返します) ' – CodetrixStudio

+0

なぜジェネリックを使っていますか?戻り値は定数型です。 Swiftが不平を言っている理由は、関数の呼び出し側は、 'T'の型が推論されるために何も入力しないので、関数が返すものは何も知らないということです。 – Hamish

+0

1)もし私がそれを働かせれば、それはハードコーディングされません。(私は別のItemContainerControllerFactoryタイプを返すことができます) 2)私はTが戻り値の型(ItemPageControllerFactory)にバインドされ、型を推測することができるでしょうか? – Chylis

答えて

0

あなたがそうであるようにプロトコルで一般的なインスタンスを作成するためには、あなたのプロトコルで初期化が必要

何か:

protocol TestProtocol { 
    init() 
} 

func create<T: TestProtocol>() -> T { 
    return T() 
} 
+0

それは私が後にしていることではありません。私はあなたの例でどのようなタイプの(有効なTestProtocolサブタイプの)私のために返すかを決定するための '作成'メソッドが欲しいです。呼び出し側は、 'TestProtocol'インタフェースについてのみ知っている必要があります。 – Chylis

+0

これはあなたのエラーではないので、私はそれを修正しました:-)それが本当にあなたがやっていることなら、ジェネリックを使う必要はありません。 – PeejWeej

+0

ジェネリックスなしで次のタイプを記述することはできますか? "associatedtype ContainerType:UIViewController、ItemContainer"(Objective-CのUIViewController など) – Chylis

関連する問題