【发布时间】:2018-01-24 09:57:44
【问题描述】:
我正在尝试为 MVVM Swift 实现泛型。我有两个基类,一个泛型类的协议。这里的特别之处是继承。我尝试了三个小时,但我无法修复它:(。
protocol ObjectProtocol {
var id: Int { get set }
var name: String { get set }
}
class BaseViewModel<T: ObjectProtocol> {
var objects: [T] = []
init(){
}
}
protocol ListViewControllerType {
associatedtype T: ObjectProtocol
associatedtype ViewModelType: BaseViewModel<T>
var viewModel: ViewModelType! { get set }
func showError(error: String)
}
extension ListViewControllerType {
func showError(error: String) {
print(error)
}
}
class Consult: ObjectProtocol {
var id: Int = 1
var name: String = "Consult"
}
class ConsultViewModel<T: Consult>: BaseViewModel<Consult> {
}
class ConsultViewController: ListViewControllerType {
var viewModel: ConsultViewModel<Consult>!
}
但我在var viewModel: ConsultViewModel<Consult>! 中遇到错误
这是错误:Type 'ConsultViewController' does not conform to protocol 'ListViewControllerType'
有泛型和继承经验的人可以帮助我。 非常感谢。
【问题讨论】:
-
尝试删除
ConsultViewController的所有实现并让Xcode生成存根 -
Xcode 只生成变量但不生成类型
class ConsultViewController: ListViewControllerType { typealias T = Consult typealias ViewModelType = ConsultViewModel<T>! }但还是不行 -
查看this gist 以获取有关该错误的更多信息。添加类型别名后,实际错误似乎是
'ConsultViewController.ViewModelType' (aka 'ConsultViewModel<Consult>') does not inherit from 'BaseViewModel<T>'。似乎编译器无法将T推断为Consult的BaseViewModel<T>。在泛型函数中,编译器可以确定T对于ConsultViewModel和BaseViewModel是相同的,实际上确定了继承。不过还没想出解决办法。 -
我仍然无法修复它。
-
我试图从协议转换为继承,但它仍然不起作用。你可以看到要点