【问题标题】:Adoption of Protocol in Swift在 Swift 中采用协议
【发布时间】:2016-02-26 16:17:49
【问题描述】:

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

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

类型“Y”不符合协议“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 类型?

【问题讨论】:

    标签: swift protocols covariance contravariance


    【解决方案1】:

    这是因为协议X 声明someA 的类型为A,所以在Y 类中,如果你将someA 的类型设置为B,那么你不能分配任何类型的东西A 给它,协议说你需要能够做到这一点。

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

    【讨论】:

    猜你喜欢
    • 2018-09-27
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多