【问题标题】:Swift override generic swiftSwift 覆盖通用 swift
【发布时间】: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&lt;Consult&gt;! 中遇到错误

这是错误:Type 'ConsultViewController' does not conform to protocol 'ListViewControllerType'

有泛型和继承经验的人可以帮助我。 非常感谢。

【问题讨论】:

  • 尝试删除ConsultViewController的所有实现并让Xcode生成存根
  • Xcode 只生成变量但不生成类型class ConsultViewController: ListViewControllerType { typealias T = Consult typealias ViewModelType = ConsultViewModel&lt;T&gt;! } 但还是不行
  • 查看this gist 以获取有关该错误的更多信息。添加类型别名后,实际错误似乎是'ConsultViewController.ViewModelType' (aka 'ConsultViewModel&lt;Consult&gt;') does not inherit from 'BaseViewModel&lt;T&gt;'。似乎编译器无法将T 推断为ConsultBaseViewModel&lt;T&gt;。在泛型函数中,编译器可以确定T 对于ConsultViewModelBaseViewModel 是相同的,实际上确定了继承。不过还没想出解决办法。
  • 我仍然无法修复它。
  • 我试图从协议转换为继承,但它仍然不起作用。你可以看到要点

标签: swift generics mvvm


【解决方案1】:

我通常是这样的:

class BaseViewModel {
}

class TemplateViewModel<T: ObjectProtocol>: BaseViewModel {
    var objects: [T] = []
    init(){
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多