Ich habe ein 'ItemContainer' Protokoll und UIViewController-Unterklasse 'ItemPageController', die mit dem Protokoll übereinstimmt.Swift 2.2 Generics: "Return-Ausdruck vom Typ ItemPageControllerFactory kann nicht in Return-Typ T konvertiert werden"
Ich habe auch ein 'ItemContainerControllerFactory' Protokoll und eine Struktur, die diesem Protokoll entspricht.
Das Problem: Ich möchte eine Methode erstellen, die einen entsprechenden ItemControllerControllerFactory-Untertyp zurückgibt. Allerdings habe ich den folgenden Compiler-Fehler: „Can not return Ausdruck vom Typ ItemPageControllerFactory konvertiert Typ T return“
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"
}
Irgendwelche Ideen, was ich falsch mache?
Änderung 'Rückkehr ItemPageControllerFactory()' auf 'Rückkehr T () ' – CodetrixStudio
Warum verwenden Sie ein Generikum? Der Rückgabewert ist von einem konstanten Typ. Der Grund, warum sich Swift beschwert, ist, dass der Aufrufer der Funktion keine Ahnung hat, was sie zurückgibt, da sie niemals etwas in sie eingibt, damit der Typ von "T" abgeleitet werden kann. – Hamish
1) Wenn ich es funktioniert, wird es nicht hart codiert werden (Ich möchte verschiedene ItemContainerControllerFactory-Typen zurückgeben) 2) Ich dachte, dass T an den Rückgabetyp (ItemPageControllerFactory) und damit den Aufrufer gebunden werden würde wäre in der Lage, auf den Typ zu schließen? – Chylis