VIPER子类中的泛型类型。无法将类型'ChildType'的值分配为类型'ParentType <any>?”

时间:2019-05-06 21:11:01

标签: ios swift generic-programming viper viper-architecture

我具有VIPER体系结构,并且我想创建与泛型类型一起使用的父VIPER搜索组件。这个想法很简单,所以我有搜索栏并且有表格视图。例如,我可以在表格视图中显示饮料或食品名称。取决于我要显示的通用数据类型或食物或饮料。

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

我将跳过对所有VIPER类(如{RouterInterdictor等)的描述。

所以我有父视图控制器:

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

和孩子:

FoodSearchViewController: BaseSearchViewController {
}

这是在BaseSearchViewController中指定的父级演示者

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

我也有一个儿童食品搜索演示者,我想在表格中显示特定类型的食品:

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

1 个答案:

答案 0 :(得分:1)

我就如何解决此问题发表了评论,但对于您的具体情况,答案是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外,请勿继承任何内容。然后构建第二个视图控制器,它将在此应用程序中有意义并且需要类似的东西。 然后提取它们之间的共性。这将趋向正确的方向。