泛型函数

我最近使用了map函数,并注意到它的默认返回类型是“ T”。经过一番调查(例如Stackoverflow搜索),我发现“ T”代表一个占位符类型,并且map函数是通用的。 起初,我对自己说“太棒了!”,然后我的下一个想法是“但是,等等,什么是通用函数……🤔”如果您想知道同一件事,请继续阅读!

在分解通用函数之前,让我们首先(简要地)讨论通用代码。 根据Apple的文档,“通用代码使您可以编写灵活,可重用的函数和类型,这些函数和类型可以根据您定义的要求使用任何类型。”您可能熟悉的两个泛型是数组或字典-两种集合类型均允许您可以使用任何类型。 例如,一个字典可能是[String:String]类型,而另一个字典可能是[String:Double]类型。 同样,数组可以是[Int]类型,也可以是[Float]…类型。 按照这种逻辑, 泛型函数是接受任何类型的参数并返回任何类型的函数。

如果您看一下上面的函数,您可能会注意到calculateMinimum函数仅适用于Int类型。 如果我想对Float类型或Double类型使用完全相同的逻辑,则我必须为每种类型创建两个附加函数。 多次重复相同的代码似乎很愚蠢,对吧? 苹果公司也这么认为,这就是引入泛型功能概念的原因。

通用参数和通用返回类型

上面的genericCalculateMinimum函数与calculateMinimum完全相同,但有两个例外。 首先,genericCalculateMinimum而不是接受Int类型的参数并返回Int类型,而是接受类型“ T”的参数并返回类型“ T”。用编写的“ T”告诉Swift,类型“ T”的参数为实际上只是一个占位符类型。 因此,Swift知道在调用函数时根据函数内的输入来推断类型。 例如,如果我们看一下上面的第一个print语句,输入为4和2,Swift推断4和2为Int类型。 由于该函数返回“ T”,因此Swift对参数类型的推断也使其可以返回正确的类型。 因此,在这种情况下,它返回Int类型的值。 在函数内,如果尝试将valueToReturn设置为Bool,则会收到错误消息,因为Bool无法转换为该函数的正确Int返回类型。

同样,Swift从最后一个打印语句推断出参数的类型为String,因此它返回的值为String。 您可能想知道为什么将“ hello”打印为最小值而不是“ yes”。这是因为Swift会根据字符串的哈希值计算字符串的“值”。 根据Apple的文档,“…哈希值是一个Int值,对于所有相等比较的对象来说都是相同的……”用简单的英语来说,哈希值可以比较两个相同类型的变量。 默认情况下,String,Int,Double和Bool类型都可以访问hashValue属性。 查阅Alex的博客,以了解有关哈希值和哈希协议的更多信息。

上面两个函数之间的第二个区别是,genericCalculateMinimum符合Comparable协议。