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

标签 ios swift generics viper-architecture

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

我找到了 very good example这解决了我的通用 View Controller 问题。但我想为快速通用的 VIPER 架构创建类似的东西。

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

所以我有父 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/

相关文章:

ios - 有没有办法自动发现第三方库是否更新了

ios - 获取 Xib 文件的引用

ios - 如何在应用程序加载时显示 viewController?

c# - 如何指定 C# 泛型类型必须支持 Parse(string)?

java - 如何使用Java反射读取泛型参数的类类型

ios - 是否可以通过代码向仪器添加标记?

ios - 可选类型 "AnyObject?"的值未解包,您是否打算使用!或者?

ios - Swift:键盘阻塞 TextView

java - 定义和引用在 Play 模板签名中绑定(bind)的泛型类型

ios - Swift:来自中心的 UIBezierPath 描边动画