协议与自身的行为

2024-02-26

我最近在读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(使用前将#替换为@)

协议与自身的行为 的相关文章