Почему переменная субпротокольного типа не соответствует супер-протоколу в Swift? - PullRequest
0 голосов
/ 11 июля 2019

У меня есть корневой протокол 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 }.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...