何时在 Swift 中使用类型约束?

When to use Type Constraints in Swift?

Swift 文档说协议被视为任何其他类型,但查看一些示例,我发现正在使用 'type constraint' 构造而不是协议。

我们以Swift字典为例:

struct Dictionary<Key: Hashable, Value>: CollectionType, DictionaryLiteralConvertible {
  // ...
  subscript (key: Key) -> Value?    
  // ...
}

能不能这样写

struct Dictionary<Value>: CollectionType, DictionaryLiteralConvertible {
  // ...
  subscript (key: Hashable) -> Value?    
  // ...
}

?

我可以看到类型约束对于具有关联类型的类型的 where 条件很有用,但我不确定这个具体示例。

如果您尝试实现类似于您的第二个示例的内容,编译器会抱怨 Protocol 'Hashable' can only be used as a generic constraint because it has Self or associated type requirements。这是因为 Hashable 最终扩展了 Equatable,这要求相等语句的左侧和右侧都是 完全相同的类型 其他。但是,在您的第二个示例中,您只是要求字典键为 Hashable,而不是所有键都是相同的具体类型。查看 this answer 以获得更完整的解释。