自从我开始学习Swift闭包以来,我发现自己实际上正在寻找它们,并尝试将它们更频繁地注入我的作品中。 我本着同样的精神涉足函数式编程 不可避免地 高阶函数 。 函数式编程已成为更高级的编程方法之一,它已成为摆在桌面上的一席之地。 但是,这与功能编程无关。 这是关于我对闭包的学习; 它们如何在高阶函数中使用,以及扩展后,它们在函数编程中的作用。 如果您尚未探索函数式编程,建议您这样做。 将您的🐽放到那里,看看是否喜欢它。 你知道他们在说什么,没有有害的知识。 本文主要借鉴了Ray Wanderlich的本教程,主要是因为我发现它很好地解释了并且阅读起来很有趣。 Ray Wanderlich的教程难道不是很棒吗? 🙌
要继续学习本章,您需要基本的闭包知识。 不是你的茶吗? 不用担心,当我的学习也不是我在这里喝茶的时候,我就写下自己的学习内容。
在进行函数编程之前,让我们回到舒适的区域。
这是我们最常使用的东西。 您有一个列表,想要遍历该列表并执行某些操作。 您将做什么,请召唤for循环! 这就是所谓的命令式编程 。 这看起来很整洁,您了解它并且很容易编写。 那么,为什么要解决未损坏的问题呢? 这就是为什么!
for
上面的示例实际上只是一行代码,它很简洁,即使现在看起来不太像,但编写起来却容易得多。 这些只是我们看到的一些优势,我们将在进行过程中探讨其他更大的优势。 我有你的兴趣吗? 现在我们可以尝试定义什么是功能编程。
函数式编程是专注于数学计算并避免状态和可变数据的范例。
一旦避免了状态数据和可变数据,我们将转向高阶函数来填补空白。 与定义高阶函数一样,这似乎是一个好时机。
高阶函数是接受其他函数作为参数,可以返回一个函数或同时返回两者的函数。 当我们在这里探索闭包时,我们提到闭包被称为高阶函数functions。
上面有一个小问题,我们将使用它来查看几个高阶函数。 这是一个书店模型。 有各种组成部分的书籍和书籍清单。
这是一个闭包 , 接受一个函数作为其参数,并在将函数应用于数组中的每个元素后返回 长度相同 的数组 。
我们希望在我们的小书店中获得所有书名的列表。 我们该怎么做呢?
在这里,我们将实现map 。 等一下,我们不是说地图接受功能吗? 我看不到它接受任何功能。 这是什么法术? 好吧,让我们看看我们如何到达这里。
map
您还记得$0? 当我们学习闭包时,我们发现这是一种引用函数参数的简便方法。 在这种情况下,我们指的是函数的第一个参数,在本例中是唯一的参数。 上面的代码行看起来奇怪吗? 这是因为当我们学习闭包时,我们观察了某种闭包的风格,称为尾随闭包 。 这是一个结尾的闭包。
$0?
过滤一个ccepts另一个函数作为参数,该另一个函数接受数组中的单个值 。 然后,它将输入函数应用于调用数组的每个元素,并返回另一个仅包含参数函数为其返回true的元素的数组。
我知道,这听起来像是一个大嘴巴。
如果我们想找到所有适合儿童的书籍怎么办?
让我们坐下来脏dirty
我们该怎么做?
kidFriendly
这有效,但是显然这是当务之急。 我们告诉编译器我们想要什么,我们想要什么,我们如何进行声明式执行
这是一种方法。
boolean
然后,该函数仅返回满足其应用条件的元素的新数组。
您还记得尾随闭包。 好吧,我们可以在这里召唤一个,然后将其注入到封闭中。
它带有两个参数; 一个起始值,第二个是将一个值与集合中的元素组合以产生另一个值的函数。
注意:要添加到数组元素中的值应为相同类型,否则会出现错误。
有人想在我们的书店里买所有的书,我们需要得到其中所有东西的费用。 我们该怎么做呢?
那工作做对了吗?
这两个闭包只给您一个更整洁的响应,您才能得到相同的响应。 😃
它采用两种收集类型,并将它们组合为一个。
问题4
假设我们在这家书店的另一层有不同的书籍,我们将它们存储在不同的阵列中。 如果我们想在我们的书店中找到所有的书,则需要将两个数组拼合为一个。
势在必行
声明式地
看,简单又快捷!
如果我们可以将我们学到的所有知识组合成一个巨型的超高阶函数,该怎么办?
如果我们可以一次解决问题1,问题2,问题3和问题4怎么办? 💡
问题兆
我们希望获得两个清单中所有儿童友好书籍的费用。
我们要;
使用链接,我们得到了一个魔力十足,功能强大的高阶函数,或者我应该说最高阶函数😃。
我答应告诉您使用功能的好处。 在您指控我点击诱饵之前,尽管确实没有多少点击诱饵😆,让我们来看一下。
如果您查看最高顺序函数 (是的,现在已经是事情了),您将观察到我排列函数的顺序。 意识到这一点很重要,这样您才能获得优化的功能。