我最近在读Swift 中的协议、通用类型约束和数组 http://letvargo.mooo.com/protocols-generic-type-constraints-and-arrays-in-swift/。我的问题涉及博客中的以下两个示例:
代码:
protocol MyProtocol1 {
var myValue: Self { get }
}
let array: [MyProtocol1] = [] // Error.
产生错误:
协议“MyProtocol1”只能用作通用约束,因为
它具有自身或关联类型要求。
这是预料之中的,并且已经有几个关于该主题的问题。然而,通过改变myValue
对于函数来说,不再有任何错误,但在这两种情况下Self
被返回。
protocol MyProtocol2 {
func myValue() -> Self
}
let array: [MyProtocol2] = [] // This is okay.
有谁知道这种看似奇怪的行为的原因?
这段视频大约有 18 分钟的解释:https://developer.apple.com/videos/wwdc/2015/?id=408 https://developer.apple.com/videos/wwdc/2015/?id=408
因为您的协议引用“self”,所以它只能用作通用约束,而不能用作类型。
例子:
假设有 2 个结构体实现了您的协议 - Duke 和 Silver。
如果您创建了一个协议 2 ([protocol2]) 的数组,那么您的数组可能包含 Dukes 或 Silvers。
myValue 特别声明返回值必须是 self。这意味着公爵必须返回公爵,银牌必须返回银牌。因此,您不能将 Dukes 和 Silvers 放在同一个数组中,因为它们的 MyValue 函数具有不同的返回值。
要解决此问题,您可以:
1)将myValue的返回类型设置为protocol2,以便Dukes和Silvers都只返回protocol2类型
2)制作符合协议2的泛型数组
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)