VIPER 子类化中的泛型类型。无法将类型 'ChildType' 的值分配给类型 'ParentType<Any>?'
Generics types in VIPER subclassing. Cannot assign value of type 'ChildType' to type 'ParentType<Any>?'
我有 VIPER 架构,我想创建 parent 适用于通用类型的 VIPER 搜索组件。这个想法很简单,所以我有搜索栏和 table 视图。例如,我可以在 table 视图中显示饮料或食物名称。取决于我指定要显示的通用数据类型或食物或饮料。
我发现 very good example 解决了我的通用视图控制器问题。但我想为 swift 通用 VIPER 架构创建类似的东西。
我将跳过描述所有 VIPER 类,例如(Router
、Interdictor
等)。
所以我有 parent 视图控制器:
BaseSearchViewController: UIViewController {
var presenter: BaseSearchPresenter<Any>?
}
和child:
FoodSearchViewController: BaseSearchViewController {
}
这是在 BaseSearchViewController
中指定的 parent 演示者
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
以外的任何东西。然后构建第二个视图控制器,它在这个应用程序中有意义并且需要类似的东西。 然后提取它们之间的共性。这将引导您朝着正确的方向前进。
我有 VIPER 架构,我想创建 parent 适用于通用类型的 VIPER 搜索组件。这个想法很简单,所以我有搜索栏和 table 视图。例如,我可以在 table 视图中显示饮料或食物名称。取决于我指定要显示的通用数据类型或食物或饮料。
我发现 very good example 解决了我的通用视图控制器问题。但我想为 swift 通用 VIPER 架构创建类似的东西。
我将跳过描述所有 VIPER 类,例如(Router
、Interdictor
等)。
所以我有 parent 视图控制器:
BaseSearchViewController: UIViewController {
var presenter: BaseSearchPresenter<Any>?
}
和child:
FoodSearchViewController: BaseSearchViewController {
}
这是在 BaseSearchViewController
中指定的 parent 演示者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
以外的任何东西。然后构建第二个视图控制器,它在这个应用程序中有意义并且需要类似的东西。 然后提取它们之间的共性。这将引导您朝着正确的方向前进。