VIPER 子类化中的泛型类型。无法将类型 'ChildType' 的值分配给类型 'ParentType<Any>?'

Generics types in VIPER subclassing. Cannot assign value of type 'ChildType' to type 'ParentType<Any>?'

我有 VIPER 架构,我想创建 parent 适用于通用类型的 VIPER 搜索组件。这个想法很简单,所以我有搜索栏和 table 视图。例如,我可以在 table 视图中显示饮料或食物名称。取决于我指定要显示的通用数据类型或食物或饮料。

我发现 very good example 解决了我的通用视图控制器问题。但我想为 swift 通用 VIPER 架构创建类似的东西。

我将跳过描述所有 VIPER 类,例如(RouterInterdictor 等)。

所以我有 parent 视图控制器:

BaseSearchViewController: UIViewController {
   var presenter: BaseSearchPresenter<Any>?
}

和child:

FoodSearchViewController: BaseSearchViewController {
}

这是在 BaseSearchViewController

中指定的 parent 演示者
class BaseSearchPresenter<T> {
    var items [T]
}

我也有 child 食物搜索主持人,我想在我的 table 中显示特定类型的食物:

class FoodSearchPresenter: BaseSearchPresenter<Food> {
}

当我尝试配置我的 VIPER 时:

let viewController = FoodSearchViewController(...) // init VC
let presenter = FoodSearchPresenter()

viewController.presenter = presenter // assigning child FoodSearchPresenter instance to a BaseSearchViewController presenter variable leads to this error:

Cannot assign value of type 'FoodSearchPresenter' to type 'BaseSearchPresenter<Any>?'

这是一个 repo 问题。

我留下了关于如何解决这个问题的评论,但对于您的具体情况,答案是 BaseSearchViewController 需要通用。

class BaseSearchPresenter<T> {
    var items: [T] = []
}

// BaseSearchViewController must be generic in order to vary its Element
class BaseSearchViewController<Element>: UIViewController {
    var presenter: BaseSearchPresenter<Element>?
}

struct Food {}

class FoodSearchPresenter: BaseSearchPresenter<Food> {}

class FoodSearchViewController: BaseSearchViewController<Food> {}

let viewController = FoodSearchViewController()
let presenter = FoodSearchPresenter()

viewController.presenter = presenter

关于开始具体的观点,我的意思是从 FoodSearchViewController 开始。不要继承 UIViewController 以外的任何东西。然后构建第二个视图控制器,它在这个应用程序中有意义并且需要类似的东西。 然后提取它们之间的共性。这将引导您朝着正确的方向前进。