使用泛型代码,你可以 写出可重用的函数和数据结构,只要它们满足你所定义的约束,它们就能够适用于各种类型。
比如,像是 Array 和 Set 等多个类型,实际上是它们中的元素类型就是泛型抽象。
我们也可以 创建泛型方法,它们可以对输入或者输出的类型进行泛型处理。
func identity(input: A) -> A 就定义了一个可以作用于任意类型 A 的函数。
某种意义上,我们甚至可以认为带有关联类型的协议是 “泛型协议”。关联类型允许我们对特定的实现进行抽 象。IteratorProtocol 协议就是一个这样的例子:它所生成的 Element 就是一个泛型。
泛型编程的目的是表达算法或者数据结构所要求的核心接口。
使用泛型数据类型来重构代码,能使它们易于测试,更加灵活。
重载
重载:拥有同样名字,但是参数或返回类型不同的多个方法互相称为重载方法。
Swift 有一系列的复杂规则来确定到底使用哪个重载函数,这套规则基于函数是否是泛型,以及传入的参数是怎样的类型来确定使用优先级。整套规则十分复杂,不过它们可以被总结为一句话,那就是 “选择最具体的一个”。也就是说,非通用的函数会优先于通用函数被使用。
重载的使用是在编译期间静态决定的。也就是说,编译器会依据变量的静态类型来决定要调用哪一个重载,而不是在运行时根据值的动态类型来决定。
泛型
泛型编程让我们的资源类型更加简单,耦合更少,这也让测试更加容易
1、创建泛型数据类型,泛型函数
2、标准库中的 min函数
3、全模块优化 之 泛型特化
Swift 中有一个叫做 @_specialize 的半官方标签