“ Protocol…只能用作通用约束,因为它具有Self或关联的类型要求”是什么意思?


123

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

协议“ myProtocol”只能用作通用约束,因为它具有“自我”或相关类型要求

而且我不能做它的正面或反面。

protocol Observing: Hashable { }

var observers = HashSet<Observing>()


@jtbandes不是重复的。我问的是错误消息的实际含义。什么是“自我或相关类型要求”?
devios1 2014年

Answers:


90

协议Observing从协议继承Hashable,而协议又从协议继承Equatable。协议Equatable具有以下要求:

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

并且包含Self在其中某处的协议只能在类型约束中使用,而不能在任何地方使用。

是一个类似的问题。


7
...因为编译器必须确保其两侧的类型相同,但是协议仅确保其符合合同规定。我懂了。不过,似乎Equatable并不一定要暗示,Equatable因为生成散列代码并非绝对必要。
devios1 2014年

4
哦,别急,因为Dictionary需要知道一个给定的对象是否确实是正确的密钥,因为两个不同的对象有可能生成相同的哈希码。嗯,这有点棘手。因此,这里的问题确实存在Equatable
devios1 2014年

4
请看0:56,这是Alexis Gallagher的精彩演讲,标题为:关联类型的协议以及它们的获取方式(也许) youtu.be/XWoNjiSPqI8
finneycanhelp 2015年

@finneycanhelp谢谢👍👍。很棒的视频!
devios1

11

为了解决这个问题,您可以使用泛型。考虑以下示例:

class GenericClass<T: Observing> {
   var observers = HashSet<T>()
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.