5

我尝试建立各种协同工作的协议。不幸的是,我不能让它们按我想要的方式工作。看下面的代码,我想我的目标很明显:我想要一个符合协议 X 的类。如果它符合协议 Y,但协议 Y 继承自协议 X,它也应该被接受为符合协议的类. 相反,我收到以下编译错误

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

Inferred type 'ExampleViewControllerType' (by matching requirement 'viewController') is invalid: does not conform to 'ViewType'

当前设置:

protocol ViewModelType: class {
    associatedtype VC: ViewType
    weak var viewController: VC! { get set }
}

class ExampleViewModel: ViewModelType {
    weak var viewController: ExampleViewControllerType!
}

protocol ViewType: class { }    
protocol ExampleViewControllerType: ViewType { }

class ExampleViewController: UIViewController, ExampleViewControllerType { 

}
4

2 回答 2

2

我可以看到您使用“传递”协议得到了什么,但是您的错误是由错误associatedtype中看到的 VC 声明引起的。

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

我认为编译器在这里遇到困难可能是因为它不恰当地使用了associatedtype声明。

Anassociatedtype可以被认为是未知类型的占位符。

通过定义VCassociatedtype你让任何继承的类决定应该是ViewModelType什么类型。VC

ExampleViewModel课堂上,你可以通过typealias在符合的类中设置类型来做到这一点。

然后,您viewController可以在ExampleViewControllerType不引起“推断”错误的情况下

protocol ViewModelType: class {
    associatedtype VC
    var viewController: VC! { get set }
}

class ExampleViewModel: ViewModelType {
    typealias VC = ExampleViewControllerType
    weak var viewController: ExampleViewControllerType!
}

protocol ViewType: class { }
protocol ExampleViewControllerType: ViewType { }

class ExampleViewController: UIViewController, ExampleViewControllerType {

}
于 2016-10-14T10:25:03.930 回答
1

不!!它不能是符合类(如果它符合协议 Y,但协议 Y 继承自协议 X,它也应该被接受为符合类)。一个协议可以继承一个或多个其他协议,并且可以在它继承的要求之上添加进一步的要求。协议继承的语法类似于类继承的语法。您不能扩展协议以符合另一个协议。只有一个类满足协议强制执行的所有要求。您可以扩展协议以提供默认实现。

extension Y {
  // default implementations 
}

更多协议继承

于 2016-10-14T09:52:17.903 回答