在 Swift 中通过协议

Adoption of Protocol in Swift

我很难理解为什么我在 Swift 中遇到特定错误。

具体来说,如果我有一个协议 'X',它定义了一个必须采用另一个协议 'A' 的 属性。 如果我在另一个 class 'Y' 中采用 'X',但尝试将所需的 属性 声明为实现 A 的类型,我会收到以下错误:

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?

这是因为协议 X 规定 someA 是类型 A,所以在 class Y 中,如果你使 someA 类型 B,那么你不能将任何类型 A 分配给它,协议规定你需要能够这样做。

如果协议说你需要一个变量来保存任何 Car,而你有一个 Porsche,那么你只是想告诉你的协议符合 class 变量只能持有一个 Porsche,然后出现并试图将 Mazda 放入你的 Porsche 变量的人会遇到问题,因为协议规定他们应该能够这样做。