Swift中的泛型

泛型编程是一种灵活地编写可重用函数和类型的方法

它的特点是快速,许多通用的标准libaray快速构建。

让我们了解它解决了现有问题

上面的函数使用引用传递来交换两个Int,现在,如果我需要编写一个可以交换字符串的函数,我将再编写一个如下所示的函数

如您所见,两个函数的实现主体相同,唯一的区别在于参数的类型。

现在让我们看看泛型如何解决上述双重代码

那就是我们交换两个值的通用函数的样子,

  • 在功能名称之后 指示这是一个通用函数,其参数类型为T
  • 函数参数列表包含类型为T而不是Int,Double或String,将替换为实际类型

下面的代码显示了上面的通用函数swapTwoValues如何用于swapTwoValues Strings,Int值。

因此,这就是泛型,泛型功能的快速介绍。

我们将涵盖的主题将进一步阅读

  • 通用类型
  • 类型约束到通用函数/类型
  • 关联类型

不出所料,是的! 您可以快速编写通用类型,我们日常使用的最常见类型ArrayDictionary是通用类型

让我们深入研究代码,无需任何进一步的理论

上面的结构IntStack使用数组来推入并弹出Int项以进行堆栈,而push() & pop()函数正在更改,因为它们正在修改结构项数组。

现在让我们看看我是否需要一个通用类型,该通用类型不仅可以推入和弹出Int项目类型,还可以推入和弹出其他类型。

差别不大吗?

结构名称后面附加通用语法 ,其中Element是一种类型,将用实际的类型(Int,Double,String等)替换

在三个地方用作占位符的Element

  • Element类型的值数组初始化的属性items
  • push()函数采用类型为Element的参数
  • 函数pop()返回值是Element类型

上面的代码显示了我们如何使用通用Stack推入和弹出类型为String和Int的项目。

扩展通用类型

上面的代码片段是其中类型为topItem的值类型Stack的扩展,其中topItemElement类型,如果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数据结构。