泛型的发展历史以及泛型的概述
C++ 泛型
- 面对对象库
- MFC
- 模板库
- STL
- Boost
template vs generic
- 模板是C++泛型编程的基础
- 泛型更来指一种编程思想
为什么需要泛型
- 下面swapTwoInts(_: _:)是一个标准的非泛型函数,用于交换两个Int值
- 如果你想交换两个String值,或者两个Double值,你只能再写更多的函数,比如下面的swapTwoStrings(_: _:)和swapTwoDoubles(_: _:)函数
- swapTwoInts(_: _:)、swapTwoStrings(_: _:)和swapTwoDoubles(_: _:)函数体是一样的。唯一的区别是它们接受值类型不同(Int、String和Double)
如何在Swift中定义泛型函数
泛型函数定义
- 泛型函数可以用于任何类型。这里是上面提到的swapTwoInts(_: _:)函数的泛型版本,叫做swapTwoValue(_: _:)
类型形式参数
命名类型形式参数
如何在Swift中定义泛型类型
泛型类型
- 除了泛型函数,Swift允许你定义自己的泛型类型。它们是可以用于任意类型的自定义类、结构体、枚举,和Array、Dictionary方式类型
泛型Stack
扩展泛型类型
- 当你扩展一个泛型类型时,不需要在扩展的定义中提供类型形式参数列表。原始类型定义的类型形式参数列表在扩展体里仍然有效,并且原始类型形式参数列表名称也用于扩展类型形式参数
Swift泛型中的类型约束
类型约束
类型约束语法
- 在一个类型形式参数名称后面放置一个类或者协议作为形式参数列表的一部分,并用冒号隔开,以写出一个类型的约束。下面展示了一个泛型函数类型约束的基本语法(和泛型类型的语法相同)
类型约束的应用
- 这是一个叫做findIndex(ofString:in:)的非泛型函数,在给定的String值数组中查找给定的String值。findIndex(ofString:in:)函数返回一个可选的Int值,如果找到了给定字符串,它会返回数组中第一个匹配的字符串的索引值,如果找不到给定字符串就返回nil
这里写出了一个叫做findIndex(of:in:)的函数,可能是你期望的findIndex(ofString:in:)函数的一个泛型版本。注意,函数的返回值仍然是Int?, 因为函数返回一个可选的索引数字,而不是数组里的一个可选的值。这个函数没有编译
- Swift标准库中定义了一个叫做Equatable的协议,要求遵循其协议的类型要实现相等操作符(==)和不等操作符(!=),用于比较该类型的任意两个值。所有Swift标准库中的类型自动支持Equatable协议
- 任何Equatable的类型都能安全地用于findIndex(of:in:)函数,因为可以保证那些类型支持相等操作符。为了表达这个事实,当你定义函数时将Equatable类型约束作为类型形式参数定义的一部分书写