协议继承问题

时间:2016-10-14 09:35:54

标签: ios swift protocols associated-types protocol-inheritance

我尝试设置各种协同工作的协议。不幸的是,我不能让它们以我想要的方式工作。看看下面的代码,我认为我的目标很明显:我想要一个符合协议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 { 

}

2 个答案:

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

了解更多Protocol Inheritance