2016-02-26 197 views
1

我在努力理解为什么我在Swift中遇到特定的错误。在Swift中采用协议

具体来说,如果我有一个协议'X',它定义了一个必须采用另一个协议'A'的属性。 如果我采纳了另一类“Y” X',但尝试和申报所需的属性为实现一个类型,我得到了以下错误:

Type 'Y' does not conform to protocol 'X'

下面是一个例子:

protocol A { 

} 

class B : A { 
    var foo = "foo" 
} 

protocol X { 
    var someA : A {get set} 
} 

class Y : X { //Error: Type Y does not conform to protocol X 
    var someA = B() 
} 

如果我宣布someA为A如下:

var someA : A = B() 

没有错误,但后来我不得不投someA为B访问FOO。

我的问题是为什么我不能首先声明someA为B类?

回答

3

这是因为协议X指出someAA型的,所以在Y类,如果你B类型做出someA,那么你可以不分配A类型的东西给它,该协议说,你需要能够做到。

如果协议说,你需要一个变量来保存任何Car,和你有一个Porsche,所以你只是想告诉你的协议符合类变量只能容纳一个Porsche,然后有人谁一起和尝试来将Mazda放入您的Porsche变量中会遇到问题,因为协议说他们应该可以。

+0

你可以通过查看http://nomothetis.svbtle.com/type-variance-in-swift – Gavin

+0

和这个博客https://mikeash.com/pyblog/找到更多关于它为什么会起作用的更多信息。周五-QA-2015年11月20日 - 协方差和contravariance.html – dispute