1

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

我找到了一个很好的例子,可以解决我的通用视图控制器问题。但我想为 swift 通用 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>?'

这是一个关于这个问题的回购。

4

1 回答 1

2

我留下了关于如何解决这个问题的评论,但对于你的具体情况,答案是 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. 然后构建第二个视图控制器,它在这个应用程序中有意义并且需要类似的东西。然后提取它们之间的共性。这往往会驱使你朝着正确的方向前进。

于 2019-05-06T23:10:42.863 回答