使用或不使用'where'子句与泛型有什么区别?

Mat*_* C. 7 generics swift

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

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

func foo<T>(object: T) -> Array<T> where T: SomeClass
Run Code Online (Sandbox Code Playgroud)

Swe*_*per 10

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

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

简而言之,where允许您指定关于泛型参数的关联类型的约束,而在<>您不能这样做.