Swift文档说协议被视为任何其他类型,但是看一些例子,我看到'类型约束'正在使用构造代替协议。
让我们以Swift词典为例:
struct Dictionary<Key: Hashable, Value>: CollectionType, DictionaryLiteralConvertible {
// ...
subscript (key: Key) -> Value?
// ...
}
无法像这样编写
struct Dictionary<Value>: CollectionType, DictionaryLiteralConvertible {
// ...
subscript (key: Hashable) -> Value?
// ...
}
我可以看到类型约束对于带有相关类型的类型的 where 条件很有用,但我不确定这个具体的例子。
答案 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以获得更全面的解释。