129

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

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

而且我无法确定它的正面或反面。

protocol Observing: Hashable { }

var observers = HashSet<Observing>()
4

2 回答 2

97

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

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

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

是一个类似的问题。

于 2014-07-25T18:34:11.987 回答
12

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

class GenericClass<T: Observing> {
   var observers = HashSet<T>()
}
于 2016-10-06T12:28:29.010 回答