何时在Swift中使用Type Constraints?

时间:2015-01-14 14:52:48

标签: generics swift

Swift文档说协议被视为任何其他类型,但是看一些例子,我看到'类型约束'正在使用构造代替协议。

让我们以Swift词典为例:

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

无法像这样编写

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

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

1 个答案:

答案 0 :(得分:3)

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