自我协议的行为

时间:2015-05-06 12:45:20

标签: swift generics protocols

我最近在阅读Protocols, Generic Type Constraints and Arrays in Swift。我的问题涉及博客中的以下两个例子:

代码:

protocol MyProtocol1 {
    var myValue: Self { get }
}

let array: [MyProtocol1] = []  // Error.

产生错误:

  

协议'MyProtocol1'只能用作通用约束,因为   它有自我或相关的类型要求。

这是预期的,并且有关于该主题的几个SO问题。但是,通过将myValue更改为某个函数,不再有任何错误,但在这两种情况下都会返回Self

protocol MyProtocol2 {
    func myValue() -> Self
}

let array: [MyProtocol2] = []  // This is okay.

有谁知道这种看似奇怪的行为的原因?

2 个答案:

答案 0 :(得分:3)

该视频大约18分钟解释: https://developer.apple.com/videos/wwdc/2015/?id=408

因为您的协议引用了“self”,所以它只能用作通用约束而不能用作类型。

实施例: 假设2个结构实现了你的协议 - Duke&银。

如果您创建了一个protocol2([protocol2])数组,那么您的数组可能包含Dukes are Silvers。

myValue明确指出返回值必须为self。这意味着公爵必须归还公爵,白银必须归还银牌。因此,你不能拥有Dukes&同一阵列中的银币,因为它们的MyValue函数具有不同的返回值。

要解决此问题,您可以:

1)制作myValue协议2的返回类型,以便Dukes和Silvers都返回一个protocol2类型

2)制作一系列符合protocol2的泛型

答案 1 :(得分:0)

我对此没有明确的答案,但我觉得这可能是由于课堂规模和内部布局造成的。

具有关联类型或Self类型成员将影响对象的大小,从而影响数组大小,但使用Self作为方法返回类型将影响对象大小。