“协议......只能用作通用约束,因为它具有 Self 或关联的类型要求”是啥意思?

Posted

技术标签:

【中文标题】“协议......只能用作通用约束,因为它具有 Self 或关联的类型要求”是啥意思?【英文标题】:What does "Protocol ... can only be used as a generic constraint because it has Self or associated type requirements" mean?“协议......只能用作通用约束,因为它具有 Self 或关联的类型要求”是什么意思? 【发布时间】:2021-06-06 10:10:21 【问题描述】:

我正在尝试创建一个字典(实际上是一个 HashSet),键入 Swift 中的自定义协议,但它给了我标题中的错误:

Protocol 'myProtocol' 只能用作通用约束,因为它具有 Self 或关联的类型要求

而且我无法判断它的正面或反面。

protocol Observing: Hashable  

var observers = HashSet<Observing>()

【问题讨论】:

How to create Dictionary that can hold anything in Key? or all the possible type it capable to hold的可能重复 @jtbandes 这不是重复的。我在问错误消息的实际含义。什么是“自我或关联类型要求”? Usage of protocols as array types and function parameters in swift 的可能副本 【参考方案1】:

协议Observing 继承自协议Hashable,后者又继承自协议Equatable。协议Equatable 有以下要求:

func ==(lhs: Self, rhs: Self) -> Bool

除了类型约束之外,其中某处包含Self 的协议不能在任何地方使用。

Here 是一个类似的问题。

【讨论】:

...因为编译器必须确保它在任何一方都是 same 类型,但协议只确保它符合合同。我知道了。尽管如此,Equatable 似乎并不一定意味着 Equatable,因为这对于生成哈希码并不是绝对必要的。 哦,不用等了,因为Dictionary 需要能够知道给定对象是否确实是正确的键,因为两个不同的对象有可能生成相同的哈希码。嗯,这有点棘手。所以这里的问题真的是Equatable 看看 Alexis Gallagher 的精彩演讲 0:56,标题为:Protocols with Associated Types and how they get that way (maybe)youtu.be/XWoNjiSPqI8 @finneycanhelp 谢谢你??。很棒的视频! Swift 确实是我见过的设计最糟糕的语言之一......【参考方案2】:

要解决这个问题,您可以使用泛型。考虑这个例子:

class GenericClass<T: Observing> 
   var observers = HashSet<T>()

【讨论】:

以上是关于“协议......只能用作通用约束,因为它具有 Self 或关联的类型要求”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章