Skip to main content
 首页 » 操作系统

generics之什么时候在 Swift 中使用类型约束

2024年01月01日31del

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以获得更全面的解释。