我最近在阅读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.
有谁知道这种看似奇怪的行为的原因?
答案 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作为方法返回类型将影响对象大小。