符合协议的协议关联类型

时间:2016-02-14 01:53:07

标签: ios swift protocols

代码

我有以下协议:

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? ... }

下面是两个相关的错误:

  1. 在BaseViewController上:
  2. Type 'MainViewController' does not conform to protocol 'BaseViewController'

    1. 在ViewModel属性的MainViewController中
    2. Unable to infer associated type 'ViewModelType' for protocol 'BaseViewController'

      期望的结果

      我想限制ViewModelType的值以符合协议BaseViewModel。如果这可以通过另一种方式完成,那么这将回答我的问题。但我想知道我在这里做错了什么。

2 个答案:

答案 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>