首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >符合协议的协议关联类型

符合协议的协议关联类型
EN

Stack Overflow用户
提问于 2016-02-14 01:53:06
回答 2查看 689关注 0票数 0

我有以下协议:

代码语言:javascript
复制
protocol BaseViewController {
    typealias ViewModelType: BaseViewModel

    var viewModel: ViewModelType? { get set }
}

protocol BaseViewModel {
}

对于视图模型,我还有以下协议:

代码语言:javascript
复制
protocol MainViewModel: BaseViewModel {
}

然后在我的MainViewController中:

代码语言:javascript
复制
class MainViewController: UIViewController, BaseViewController {
    typealias ViewModelType = MainViewModel

    var viewModel: ViewModelType?

    ...
}

误差

在MainViewController上,我得到了错误

Type 'MainViewController' does not conform to protocol 'BaseViewController'

下面是两个相关的错误:

  1. 在BaseViewController上:

Unable to infer associated type 'ViewModelType' for protocol 'BaseViewController'

  1. 在MainViewController中的viewModel属性

Inferred type 'BaseViewModel' (by matching requirement 'viewModel') is invalid: does not conform to 'BaseViewModel'

期望结果

我想将ViewModelType的值限制为符合BaseViewModel协议。如果能以另一种方式做到这一点,那就会回答我的问题。但我想知道我做错了什么。

EN

回答 2

Stack Overflow用户

发布于 2016-02-14 02:41:50

我认为您需要协议BaseViewModel的具体实现,因此将MainViewModel定义为结构或类是可行的。

票数 0
EN

Stack Overflow用户

发布于 2016-02-14 05:04:46

类型别名的文档表明其格式如下:

类型-赋值→=type

type的定义为:

类型→数组.类型字典.类型函数.标识符.元组型可选类型.类型隐式-展开式-可选型协议.组合型元类型.类型类型

protocol-composition-type的定义为:

协议.组合型→协议<协议.标识符-列表选项>

因此,列出协议似乎不受支持,因此不清楚为什么您没有收到编译错误。如果您将其更改为该格式,它似乎可以工作(编译,但我还没有测试您得到了想要的结果):

代码语言:javascript
复制
protocol BaseViewController {
    typealias ViewModelType = protocol<BaseViewModel>

    var viewModel: ViewModelType? { get set }
}

和:

代码语言:javascript
复制
class ViewController: UIViewController, BaseViewController {
    typealias ViewModelType = protocol<MainViewModel>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35387536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档