私は、プロトコルに準拠する '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式を変換できませんか」?このような
変更は '(返却T'にItemPageControllerFactoryを() 'を返します) ' – CodetrixStudio
なぜジェネリックを使っていますか?戻り値は定数型です。 Swiftが不平を言っている理由は、関数の呼び出し側は、 'T'の型が推論されるために何も入力しないので、関数が返すものは何も知らないということです。 – Hamish
1)もし私がそれを働かせれば、それはハードコーディングされません。(私は別のItemContainerControllerFactoryタイプを返すことができます) 2)私はTが戻り値の型(ItemPageControllerFactory)にバインドされ、型を推測することができるでしょうか? – Chylis