一尘不染

在泛型中使用或不使用“ where”子句有什么区别?

swift

声明带有或不带有“ where”子句的泛型超类的这两种方法之间有什么区别?

func foo<T: SomeClass>(object: T) -> Array<T>

func foo<T>(object: T) -> Array<T> where T: SomeClass

阅读 211

收藏
2020-07-07

共1个答案

一尘不染

Swift指南中明确说明了这一点:

通用where子句中的要求指定类型参数从类继承或符合协议或协议组成。尽管泛型where子句提供了语法糖来表达对类型参数的简单约束(例如,<T: Comparable>等价于<T> where T: Comparable等),但是您可以使用它为类型参数及其关联的类型提供更复杂的约束。例如,您可以约束类型参数的关联类型以符合协议。例如,<S: Sequence> where S.Iterator.Element: Equatable指定S符合Sequence协议且关联的类型
S.Iterator.Element符合Equatable协议。该约束确保序列中的每个元素都是相等的。

简而言之,where让您指定有关泛型参数关联类型的约束,而<>您不能这样做。

2020-07-07