2016-02-26 195 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