【问题标题】:Swift 2.2 Generics: "Cannot convert return expression of type ItemPageControllerFactory to return type T"Swift 2.2 泛型:“无法将 ItemPageControllerFactory 类型的返回表达式转换为返回类型 T”
【发布时间】: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


【解决方案1】:

为了创建一个像你一样使用协议的通用实例,你需要在你的协议中添加一个初始化器

类似这样的:

protocol TestProtocol {
    init()
}

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

【讨论】:

  • 这不是我想要的。我希望您的示例中的“创建”方法来决定为我返回哪种类型(有效的 TestProtocol 子类型)。调用者应该只知道“TestProtocol”接口。
  • 这不是你的错误,所以我修复了这个问题:-) 如果这确实是你正在做的,你不需要使用泛型。
  • 是否可以在没有泛型的情况下描述以下类型? “ associatedtype ContainerType : UIViewController, ItemContainer ”(如Objective-C中的 UIViewController
猜你喜欢
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 2022-12-13
  • 2018-07-31
  • 2021-01-18
  • 2016-10-25
  • 1970-01-01
相关资源
最近更新 更多