【问题标题】:Correct way to add Generic types inheritance添加泛型类型继承的正确方法
【发布时间】:2019-06-25 15:28:18
【问题描述】:

我已经创建了这些类:

class BaseViewModel<NavigatorType> {
    typealias Navigator = NavigatorType

    var navigator: Navigator!
}

class BaseViewController<ViewModel: BaseViewModel<Any>>: UIViewController {
    typealias ViewModel = ViewModel

    var viewModel: ViewModel!
}

class MyVC: BaseViewController<MyViewModel> {

}

class MyViewModel: BaseViewModel<MyNavigator> {

}

现在的问题是我在MyVC 类上收到此错误:

'BaseViewController' 要求 'MyViewModel' 继承自 'BaseViewModel&lt;Any&gt;'

如果我从BaseViewController 通用参数中删除BaseViewModel&lt;Any&gt;,则会出现错误。但我想限制视图控制器的通用 ViewModel 仅从 BaseViewModel 继承。

知道怎么做吗?

【问题讨论】:

    标签: swift


    【解决方案1】:

    专用类型BaseViewModel&lt;MyNavigator&gt; 与专用类型BaseViewModel&lt;Any&gt; 不同。我怀疑你把它想象成BaseViewModel&lt;MyNavigator&gt; 可以覆盖/继承BaseViewModel&lt;Any&gt;,因为MyNavigator 是更具体的Any。但是 Swift 不是这样工作的。我对 Swift 的内部了解不够,无法知道 为什么 它不知道,但事实并非如此!

    也许尝试将 BaseViewModel 改为协议:

    protocol BaseViewModel {
        associatedtype Navigator
    
        var navigator: Navigator! { get }
    }
    
    class BaseViewController<ViewModel: BaseViewModel>: UIViewController {
        var viewModel: ViewModel!
    }
    
    class MyVC: BaseViewController<MyViewModel> {
        func foo() {
            viewModel.navigator.bar()
            print(viewModel.mySpecificProperty)
        }
    }
    
    class MyViewModel: BaseViewModel {
        var navigator: MyNavigator!
        var mySpecificProperty: String = "Hello!"
    }
    
    class MyNavigator {
        func bar() {
            print("MyNavigator bar")
        }
    }
    

    如果目标是为视图控制器提供特定类型的视图模型以供使用,那么应该这样做。

    【讨论】:

      猜你喜欢
      • 2019-11-22
      • 1970-01-01
      • 2018-01-25
      • 2018-09-27
      • 2015-09-15
      • 2018-08-01
      • 1970-01-01
      • 2016-07-03
      相关资源
      最近更新 更多