为什么子协议类型的变量不符合Swift中的超级协议?

时间:2019-07-11 12:37:07

标签: swift

我有一个根协议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 },它仍然是相同的。

0 个答案:

没有答案