何时在 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 以获得更完整的解释。
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 以获得更完整的解释。