Swift中的闭包:续集

自从我开始学习Swift闭包以来,我发现自己实际上正在寻找它们,并尝试将它们更频繁地注入我的作品中。 我本着同样的精神涉足函数式编程 不可避免地 高阶函数 。 函数式编程已成为更高级的编程方法之一,它已成为摆在桌面上的一席之地。 但是,这与功能编程无关。 这是关于我对闭包的学习; 它们如何在高阶函数中使用,以及扩展后,它们在函数编程中的作用。 如果您尚未探索函数式编程,建议您这样做。 将您的🐽放到那里,看看是否喜欢它。 你知道他们在说什么,没有有害的知识。 本文主要借鉴了Ray Wanderlich的本教程,主要是因为我发现它很好地解释了并且阅读起来很有趣。 Ray Wanderlich的教程难道不是很棒吗? 🙌

要继续学习本章,您需要基本的闭包知识。 不是你的茶吗? 不用担心,当我的学习也不是我在这里喝茶的时候,我就写下自己的学习内容。

在进行函数编程之前,让我们回到舒适的区域。

这是我们最常使用的东西。 您有一个列表,想要遍历该列表并执行某些操作。 您将做什么,请召唤for循环! 这就是所谓的命令式编程 。 这看起来很整洁,您了解它并且很容易编写。 那么,为什么要解决未损坏的问题呢? 这就是为什么!

释放🐉,我的意思是声明性的!

上面的示例实际上只是一行代码,它很简洁,即使现在看起来不太像,但编写起来却容易得多。 这些只是我们看到的一些优势,我们将在进行过程中探讨其他更大的优势。
我有你的兴趣吗? 现在我们可以尝试定义什么是功能编程。

函数式编程是谁?

函数式编程是专注于数学计算避免状态和可变数据的范例。

一旦避免了状态数据和可变数据,我们将转向高阶函数来填补空白。 与定义高阶函数一样,这似乎是一个好时机

高阶函数

高阶函数是接受其他函数作为参数,可以返回一个函数或同时返回两者的函数。 当我们在这里探索闭包时,我们提到闭包被称为高阶函数functions。

上面有一个小问题,我们将使用它来查看几个高阶函数。 这是一个书店模型。 有各种组成部分的书籍和书籍清单。

地图

这是一个闭包接受一个函数作为其参数,并在将函数应用于数组中的每个元素返回 长度相同 的数组

问题1

我们希望在我们的小书店中获得所有书名的列表。 我们该怎么做呢?

势在必行?

声明式地

在这里,我们将实现map 。 等一下,我们不是说地图接受功能吗? 我看不到它接受任何功能。 这是什么法术? 好吧,让我们看看我们如何到达这里。

🎉

您还记得$0? 当我们学习闭包时,我们发现这是一种引用函数参数的简便方法。 在这种情况下,我们指的是函数的第一个参数,在本例中是唯一的参数。 上面的代码行看起来奇怪吗? 这是因为当我们学习闭包时,我们观察了某种闭包的风格,称为尾随闭包 。 这是一个结尾的闭包。

过滤

过滤一个ccepts另一个函数作为参数,该另一个函数接受数组中的单个值 。 然后,它将输入函数应用于调用数组的每个元素,并返回另一个仅包含参数函数为其返回true的元素的数组。

我知道,这听起来像是一个大嘴巴。

问题2

如果我们想找到所有适合儿童的书籍怎么办?

让我们坐下来脏dirty

势在必行

我们该怎么做?

  1. 创建一个列表,将其放入新的儿童友好书籍列表中
  2. 遍历书籍并设置条件,该书籍必须是类别。 kidFriendly
  3. 返回过滤列表

这有效,但是显然这是当务之急。 我们告诉编译器我们想要什么,我们想要什么,我们如何进行声明式执行

声明式地

这是一种方法。

  1. 定义要过滤器应用于每个元素的函数。 该函数应返回一个boolean
  2. 使用函数作为过滤函数的参数

然后,该函数仅返回满足其应用条件的元素的新数组。

您还记得尾随闭包。 好吧,我们可以在这里召唤一个,然后将其注入到封闭中。

降低

它带有两个参数; 一个起始值,第二个是将一个值与集合中的元素组合以产生另一个值的函数。

注意:要添加到数组元素中的值应为相同类型,否则会出现错误。

问题3

有人想在我们的书店里买所有的书,我们需要得到其中所有东西的费用。 我们该怎么做呢?

势在必行?

那工作做对了吗?

声明性地?

这两个闭包只给您一个更整洁的响应,您才能得到相同的响应。 😃

平面图

它采用两种收集类型,并将它们组合为一个。

问题4

假设我们在这家书店的另一层有不同的书籍,我们将它们存储在不同的阵列中。
如果我们想在我们的书店中找到所有的书,则需要将两个数组拼合为一个。

势在必行

声明式地

看,简单又快捷!

如果我们可以将我们学到的所有知识组合成一个巨型的超高阶函数,该怎么办?

链式

如果我们可以一次解决问题1,问题2,问题3和问题4怎么办? 💡

问题兆

我们希望获得两个清单中所有儿童友好书籍的费用。

我们要;

  1. 将两个列表平面映射为一个列表
  2. 筛选我们要获取的书籍类别
  3. 使用地图提取书籍费用
  4. 减少以获得书籍的总成本

使用链接,我们得到了一个魔力十足,功能强大的高阶函数,或者我应该说最高阶函数😃。

为什么进行函数式编程

我答应告诉您使用功能的好处。 在您指控我点击诱饵之前,尽管确实没有多少点击诱饵😆,让我们来看一下。

  • 如您所见,我们肯定提出了更简洁的代码
  • 可以无状态地分离代码的功能确保了在多线程处理过程中不会出现并发问题。
  • 如您所见,使用功能编程代码是非常模块化的。 这在测试时会派上用场,因为很容易为独立的函数编写测试,并且不会修改自身以外的任何内容。
  • 最后,当变量更改时,您是否不讨厌它,并且您无法终生弄清楚为什么会发生这种情况? 好吧,使用函数式编程已成为过去

增长机会

如果您查看最高顺序函数 (是的,现在已经是事情了),您将观察到我排列函数的顺序。 意识到这一点很重要,这样您才能获得优化的功能。

Interesting Posts