我有 VIPER 架构,我想创建适用于通用类型的父 VIPER 搜索组件。这个想法很简单,所以我有搜索栏和表格 View 。例如,我可以在表格 View 中显示饮料或食物的名称。取决于我指定要显示的通用数据类型或食物或饮料。
我找到了 very good example这解决了我的通用 View Controller 问题。但我想为快速通用的 VIPER 架构创建类似的东西。
我将跳过描述所有 VIPER 类,例如(Router
、Interdictor
等)。
所以我有父 View Controller :
BaseSearchViewController: UIViewController {
var presenter: BaseSearchPresenter<Any>?
}
和 child :
FoodSearchViewController: BaseSearchViewController {
}
这是在 BaseSearchViewController 中指定的父演示者
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
之外的任何东西继承。然后构建第二个 View Controller ,它在这个应用程序中有意义并且需要类似的东西。 然后提取它们之间的共性。这将引导您朝着正确的方向前进。
关于ios - VIPER 子类化中的泛型类型。无法将类型 'ChildType' 的值分配给类型 'ParentType<Any>?',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56012496/