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

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

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

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

protocol Observing: Hashable { }

var observers = HashSet<Observing>()

【问题讨论】:

标签: swift generics xcode6 swift-protocols


【解决方案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>()
}

【讨论】:

    猜你喜欢
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多