【发布时间】:2016-04-27 16:22:09
【问题描述】:
我有一个“ItemContainer”协议和符合该协议的 UIViewController 子类“ItemPageController”。
我还有一个“ItemContainerControllerFactory”协议和一个符合该协议的结构。
问题:我希望创建一个返回适当的 ItemControllerControllerFactory 子类型的方法。但是,我收到以下编译器错误:“无法将 ItemPageControllerFactory 类型的返回表达式转换为返回类型 T”
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"
}
对我做错了什么有任何想法吗?
【问题讨论】:
-
将
return ItemPageControllerFactory()更改为return T() -
你为什么在那里使用泛型?返回值是常量类型。 Swift 抱怨的原因是函数的调用者不知道它返回什么,因为它从不输入任何内容来推断
T的类型。 -
1) 如果我让它工作,它将不会被硬编码(我希望能够返回不同的 ItemContainerControllerFactory 类型)2)我认为 T 将绑定到返回类型(ItemPageControllerFactory)因此调用者将能够推断出类型?
-
调用者定义了泛型的类型,而不是函数。如果要使用不同类型的子类型,则必须通过相关的父类型来识别它们。在这种情况下,ItemContainerControllerFactory
标签: ios swift generics protocols factory