我有一个'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"
}
我做错了什么想法?
答案 0 :(得分:1)
为了使用协议创建通用实例,您需要在协议中使用初始化程序
类似的东西:
protocol TestProtocol {
init()
}
func create<T: TestProtocol>() -> T {
return T()
}