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