map 函数并不是Swift标准数组库中唯一一个使用泛型的函数。在后面的内容中会介绍其他几个。
假设我们有一个由字符串组成的数组,代表文件夹的内容:
现在如果我们想要一个包含所有 .swift 文件的数组,则可以很容易通过简单的循环得到:
现在可以使用这个函数来取得 exampleFiles 数组中的Swift文件:
当然,我们可以将 getSwiftFiles 函数一般化。比如,相比于使用硬编码(hardcoding)的方式筛选扩展名为 .swift 的文件,传递一个附加的 String 参数进行比对会是更好的方法。我们接下来可以使用同样的函数去比对 .swift 或 .md 文件。但是假如我们想查找没有扩展名的所有文件,或者是名字以字符串 "Hello" 开头的文件,那该怎么办呢?
为了进行一个这样的查找,我们可以定义一个名为 filter 的通用型函数。就像之前看到的 map 那样, filter 函数接受一个 函数 作为参数。 filter 函数的类型是 Element-> Bool 。对于数组中的所有元素,此函数都会判定它是否应该被包含在结果中:
根据 filter 能很容易地定义 getSwiftFiles :
就像 map 一样,Swift标准库中的数组类型已经有定义好的 filter 函数了。所以除非是作为练习,否则并没有必要重写它。
现在你可能会问:有没有更通用的函数, 既 可以用来定义 map , 又 可以用来定义 filter ?关于这个问题,我们会在本章的最后解答。