Swift中的泛型
泛型编程是一种灵活地编写可重用函数和类型的方法
它的特点是快速,许多通用的标准libaray快速构建。
让我们了解它解决了现有问题
上面的函数使用引用传递来交换两个Int,现在,如果我需要编写一个可以交换字符串的函数,我将再编写一个如下所示的函数
如您所见,两个函数的实现主体相同,唯一的区别在于参数的类型。
现在让我们看看泛型如何解决上述双重代码
那就是我们交换两个值的通用函数的样子,
- 在功能名称之后 指示这是一个通用函数,其参数类型为T
- 函数参数列表包含类型为T而不是Int,Double或String,将替换为实际类型
下面的代码显示了上面的通用函数swapTwoValues
如何用于swapTwoValues
Strings,Int值。
因此,这就是泛型,泛型功能的快速介绍。
我们将涵盖的主题将进一步阅读
- 通用类型
- 类型约束到通用函数/类型
- 关联类型
不出所料,是的! 您可以快速编写通用类型,我们日常使用的最常见类型Array , Dictionary是通用类型
让我们深入研究代码,无需任何进一步的理论
上面的结构IntStack
使用数组来推入并弹出Int项以进行堆栈,而push() & pop()
函数正在更改,因为它们正在修改结构项数组。
现在让我们看看我是否需要一个通用类型,该通用类型不仅可以推入和弹出Int项目类型,还可以推入和弹出其他类型。
差别不大吗?
结构名称后面附加通用语法 ,其中Element是一种类型,将用实际的类型(Int,Double,String等)替换
在三个地方用作占位符的Element
- 用
Element
类型的值数组初始化的属性items
-
push()
函数采用类型为Element
的参数 - 函数
pop()
返回值是Element
类型
上面的代码显示了我们如何使用通用Stack
推入和弹出类型为String和Int的项目。
扩展通用类型
上面的代码片段是其中类型为topItem
的值类型Stack
的扩展,其中topItem
为Element
类型,如果stack为空则返回topItem
,否则返回最后一个项目。
我们可以迅速对可与泛型函数和类型一起使用的类型施加某些类型约束
没得到吗?
让我们阅读下面的行,然后尝试再次映射它。
我们可以使用以下规则定义通用功能或类型,
- 使用的类型应始终确认特定的协议或协议组成
- 使用的类型应从特定的类继承
例如,在Swift的Dictionary
字典的键必须始终与协议Hashable
确认,否则不能用作Dictionary
键
让我们看一下带有类型约束的泛型函数
语法指示泛型函数将采用仅向协议
Equatable
确认的类型
默认情况下,所有数据类型String,Int,Double等都向协议Hashable
确认, Equatable
协议确认Equatable
协议,因此上述代码可以正常工作。
让我们等不及看到具有类型约束的泛型类型 ,将创建一个NavigationControllerStack
来推送和弹出属于UIViewControllers或其子类的viewcontrollers。
那就是NavigationControllerStack
样子,类名称后的语法表示,只有从UIViewController继承的此类,该类才会采用
Element
。
在上面的代码片段中,我们创建了一个从UIViewcontroller继承并推送到NavigationControllerStack
PeopleViewController
实例,与从UIViewcontroller继承的PeopleViewController
实例推送的方式相同。
在这里,我们将看到如何在协议中使用泛型。 与类,结构,枚举,协议不同,它以不同的方式支持泛型,快速的术语将其称为关联类型
协议中的关联类型说
“我不知道这是什么确切类型,采用我的一些具体的类/结构/枚举将填写详细信息。”
上面的代码片段显示了Containment
协议的声明, Containment
声明了一个名为Item
的“ associatedtype”,该协议不知道它的确切类型,实现Containment
的类或结构将知道它。
Container
协议定义了任何容器必须提供的两个必需功能:
- 它应该能够通过函数
topItem()
在返回Item
类型时访问容器中的顶层项目 - 它应该能够通过返回
Int
值的count
属性访问容器中项目的count
。
将在我们的Stack
值类型中使用以上包含协议
与Item
类型关联的协议Containment
由我们的Stack
结构作为Element
提交的占位符
表示协议功能topItem()
返回Element
类型的项目,该类型在协议声明中为Item
。
关于泛型的基础知识和相关主题,如果有兴趣,请随时查看使用泛型实现的TRIE数据结构。