代码
我有以下协议:
var obj = {};
obj[parent_node_name] = {
id2: "1175",
...
};
myFirebaseRef.update(obj, onComplete);
我还有一个视图模型的协议:
protocol BaseViewController {
typealias ViewModelType: BaseViewModel
var viewModel: ViewModelType? { get set }
}
protocol BaseViewModel {
}
然后在我的MainViewController中:
protocol MainViewModel: BaseViewModel {
}
错误
在MainViewController上我收到错误
class MainViewController: UIViewController, BaseViewController {
typealias ViewModelType = MainViewModel
var viewModel: ViewModelType?
...
}
下面是两个相关的错误:
Type 'MainViewController' does not conform to protocol 'BaseViewController'
Unable to infer associated type 'ViewModelType' for protocol 'BaseViewController'
期望的结果
我想限制ViewModelType的值以符合协议BaseViewModel。如果这可以通过另一种方式完成,那么这将回答我的问题。但我想知道我在这里做错了什么。
答案 0 :(得分:0)
我认为您需要协议BaseViewModel
的具体实现,因此将MainViewModel
定义为结构或类将起作用。
答案 1 :(得分:0)
typealias的文档表明它具有以下格式:
typealias-assignment→= type
type
定义为:
type→array-type dictionary-type function-type type-identifier tuple-type optional-type implicitly-unwrapped-optional-type protocol-composition-type元类型
protocol-composition-type
定义为:
protocol-composition-type→protocol< protocol-identifier-listopt>
因此似乎不支持列出协议,所以不清楚为什么你没有在那里得到编译错误。如果你把它改成那种格式,它似乎工作(编译,但我没有测试你得到了预期的结果):
protocol BaseViewController {
typealias ViewModelType = protocol<BaseViewModel>
var viewModel: ViewModelType? { get set }
}
和
class ViewController: UIViewController, BaseViewController {
typealias ViewModelType = protocol<MainViewModel>