У меня есть корневой протокол A
и другой протокол B
, который расширяет A
.Тогда у меня есть протокол C
, который требует переменную типа A
.Теперь, когда я реализую класс X
и объявляю переменную типа A
, он соответствует C
;но если я изменю тип переменной на B
(который расширяет A
), это ошибка компиляции.Почему?
protocol A { }
protocol B: A { }
protocol C: class {
var a: A? { get set }
}
class X: C {
var a: B?
}
Я получаю эту ошибку компиляции:
error: type 'X' does not conform to protocol 'C'
class X: C {
^
note: candidate has non-matching type 'B?'
var a: B?
^
note: protocol requires property 'a' with type 'A?'; do you want to add a stub?
var a: A? { get set }
^
[править]
Хорошо, так как тип свойства { get set }
, я не могНе присваивайте переменной a
в классе X
что-то, что соответствует A
, но не B
, и протокол требует, чтобы это было возможно, поэтому ошибка компиляции допустима ... но она все та же, даже еслиЯ изменяю тип свойства только на { get }
.