Swift 文档说协议(protocol)被视为与任何其他类型一样,但查看一些示例,我看到正在使用“类型约束”构造而不是协议(protocol)。
我们以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以获得更全面的解释。
