我具有VIPER体系结构,并且我想创建与泛型类型一起使用的父VIPER搜索组件。这个想法很简单,所以我有搜索栏并且有表格视图。例如,我可以在表格视图中显示饮料或食品名称。取决于我要显示的通用数据类型或食物或饮料。
我发现very good example解决了通用视图控制器的问题。但是我想为快速的通用VIPER架构创建类似的东西。
我将跳过对所有VIPER类(如{Router
,Interdictor
等)的描述。
所以我有父视图控制器:
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。
答案 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
外,请勿继承任何内容。然后构建第二个视图控制器,它将在此应用程序中有意义并且需要类似的东西。 然后提取它们之间的共性。这将趋向正确的方向。