Swift Generics

记得 C# 加入泛型时,让人兴奋了很一阵子,然后Ruby,ObjC中都未再接触过这东西,直到Swift中再次见到身影。

泛型优势

有了泛型后,可以将一些同类函数,合并为一种实现,在框架、类库中,这种合并让代码得到大量精简,方便构建出灵活可重用的函数和库,避免重复和写出更清晰的表达代码意图。

这意味着高效、方便理解和维护。

语法

泛型好处举例时,常用通用堆栈来说,当你要写一个堆栈时,每一种类型都需要一个特定的实现,可能还会用上一些工厂模式,而向接口的设计理念。

而泛型语法中,你只需要实现一个通用版本。

1
2
3
4
5
6
7
struct Stack<T> {
...
}
var intStack = Stack<Int>()
var stringStack = Stack<String>()

T 表示占位类型名字,类型参数指定并命名为一个占位类型,并且紧随在函数名后面,使用一对尖括号括起来(如)。

系统默认提供了泛型 Array,Dictionary,开发者可以跟据需要定义自己的泛型类型

类型约束

像上面 Stack<T> 中,我们可以使用任意类型,但有时,程序中需要对使用的类型做限定。比如

  • 类型必须是继承于指定的基类
  • 类型遵循特定的协议或协议构成
1
2
3
func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) {
// function body goes here
}

两个类型参数。第一个类型参数T,有一个需要T必须是SomeClass子类的类型约束;第二个类型参数U,有一个需要U必须遵循SomeProtocol协议的类型约束。

Where 语句

类型约束能够确保类型符合泛型函数或类的定义约束。

对关联类型定义约束是非常有用的。你可以在参数列表中通过where语句定义参数的约束。一个where语句能够使一个关联类型遵循一个特定的协议,以及(或)那个特定的类型参数和关联类型可以是相同的。你可以写一个where语句,紧跟在在类型参数列表后面,where语句后跟一个或者多个针对关联类型的约束,以及(或)一个或多个类型和关联类型间的等价(equality)关系。

REF::