我尝试设置各种协同工作的协议。不幸的是,我不能让它们以我想要的方式工作。看看下面的代码,我认为我的目标很明显:我想要一个符合协议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 {
}
答案 0 :(得分:2)
我可以看到您使用'传递'协议获得了什么,但是您的错误是由错误中显示的associatedtype
VC声明引起的。
Unable to infer associated type 'VC' for protocol 'ViewModelType'
我认为编译器在这里遇到困难可能是因为它无法正确使用associatedtype
声明。
可以将associatedtype
视为未知类型的占位符。
通过将VC
定义为associatedtype
,您允许任何继承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 {
}
答案 1 :(得分:1)
没有!!它不能符合类(如果它符合协议Y而协议Y继承自协议X,它也应该被接受为符合类)。协议可以继承一个或多个其他协议,并可以在其继承的需求之上添加进一步的要求。协议继承的语法类似于类继承的语法。您无法扩展协议以符合其他协议。只有一个类满足协议强制执行的所有要求。您可以扩展协议以提供默认实现。
extension Y {
// default implementations
}