在 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
变量的人会遇到问题,因为协议规定他们应该能够这样做。
我很难理解为什么我在 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
变量的人会遇到问题,因为协议规定他们应该能够这样做。