谈论我的泛型-第二部分(快速3)

“泛型编程 是一种 计算机编程 风格, 其中 算法 是根据 类型 编写的 待定,然后 在需要作为 参数 提供的特定类型时实例化。” — Wikipedia

使用泛型编写代码是一种编写函数和数据类型而无需指定需要使用哪种确切类型的方法。 顾名思义,泛型类型不是特定的。

通过使用泛型,我们可以编写非特定的代码,因此,我们可以以更清洁,错误更少的复杂方式抽象代码。

在上一篇文章中,我描述了数组,字典和可选变量是泛型的示例。 在第二部分的文章中,我将讨论编写通用数据类和结构,编写通用函数和约束通用类型。 第三部分将讨论关联类型和通用Where子句。

编写通用数据类和结构

虽然数组,字典和可选变量都是泛型的示例,但我们也可以使用泛型来创建自己的数据类型。 例如,我可以一个 具有泛型的数据类型-不特定于任何数据类型(浮点数,双精度数和整数)。 堆栈使用LIFO(后进先出)过程,将新项目推到堆栈顶部,然后从堆栈中取出最新项目。 我喜欢将其视为一叠纸牌,将它们一叠放在另一叠上,并且只能从顶部取出。

假设我要创建自己的堆栈。 我可以使用尖括号将其指定为通用,这意味着,我可以在创建堆栈时决定要堆栈的内容。 在这种情况下,我想编写一堆字符串,这些字符串代表我当前正在阅读的所有编码书。

1:我创建一个结构来表示我的EricasStack数据类型。 请注意,在尖括号之间使用“通用 ”一词。 我可以在那里写任何词(也许是“炸玉米饼”?)作为我在此EricasStack中使用的值的占位符。

2:我创建了一个泛型数组,该泛型将容纳我的编码书籍堆栈。

3: 我想一次将两本书添加到我的书架中,所以我编写了一个推入两个项目的函数。

4:我想一次将两本书移到我的书架中,所以我编写了一个函数,该函数返回要被POPPED的两个项目。

5:我创建一个类型的EricasStack实例。 请注意,我现在只能追加字符串。 我将两本书推到CodingBooksStack上,然后再推两本书(总共四本书)。

然后,我打印出最终的CodingBooksStack包含的内容。

当我调用.popTwoItems()时,还可以看到打印出来的打印内容。

我也可以赚到一笔EricasStack的钱:

如您在上面看到的,当我创建EricasStack类的实例时,可以用任何类型填充。

编写通用函数

假设我想获取一个Int,然后将其复制到数组中。

假设我想获取一个String,然后将其复制到数组中。

假设我想使用Float,然后将其复制到数组中。

我应该为这三种不同的类型编写三种不同的功能吗? 我可以使用GENERICS编写一个仅适用于所有类型的函数。

函数和方法在泛型类型的上下文中可以是泛型的。

1:我编写了一个名为的通用类型的函数,该函数接受一个项目,并指定一个整数,该整数指定要复制ItemToDuplicate的次数。

2:我创建一个空数组来保存我的arrayOfDuplicates。

3:循环numberOfTimes,每个团队都将一个ItemToDuplicate添加到我的arrayOfDuplicates数组中。

4:我返回填充的arrayOfDuplicates。

5:我打印出一些示例,说明如何使用不同类型的字符串作为ItemToDuplicate。

请注意,我也可以使用Ints,Doubles,Floats代替字符串。

约束通用类型

在上面的示例中,任何数据类型(Int,Float,String)都可以在通用的plicateAndMakeArray函数中使用。 我可以更具体地指定在通用上下文中可以采用的数据类型。

可以使用Swift标准库中包含的某些协议来完成此过程。 通用约束协议的一些示例包括可散列的 (即必须能够使其自身唯一地表示(哎呀,字典是受限于可散列的协议的泛型)), 可比较的 (即必须具有类似于数字的顺序)和可等于的 (即必须能够比较)。

假设我要编写一个通用函数,该函数在数组中找到最小值。 如果我试图找到最小的值,那意味着我需要遵循我之前提到的可比较协议。

1:我声明了一个符合Comparable协议且具有通用的函数。 请注意,该协议通常在“:”之后指示。 我接收一个泛型类型的数组,并精确返回该类型的一个可选值(它将是数组中的最小值)。

2:我检查以确保数组不为空。 如果是,我返回nil。

3:我将输入数组中的第一项视为“ itemToCompare”。

4:我遍历整个数组,在循环时,我将第一项与每个后续项进行比较。

5和6:如果我的itemToCompare大于每个后续项目,则我将itemToCompare重新分配为该更大的项目。

7:如果没有,我返回itemToCompare。

8:我用Ints调用findSmallestInArray函数。

9:我用Doubles调用findSmallestInArray函数。

此示例只是您可以使用协议来约束通用类型以编写书面通用函数的一种方式。

泛型可用于创建数据类型,写入函数,甚至可被限制为限制在这些函数中使用的某些类型。

在我的泛型文章的第三部分中,我将讨论关联类型和Where子句。

资源:

Apple文档—泛型