迅速。 功能阵列

Swift为iOS开发带来了很多机会。 其中有一些非常有用的功能挂钩。 有些人立即将函数式编程与复杂的数学和M字相关联,但事实并非如此。 函数是函数编程中的真正力量。

在本文中,我们将介绍如何使用其中的一些功能,以使您的日常Array例程更加舒适,避免仅通过使用函数避免代码重复和不必要的键入。

回顾我的一位同事,我们讨论了下一个功能:

现在该回到我们的摘要了。 在第2行中,我们为将在第3行中使用的函数形成一个元组。因此,在第3行中,只要意识到offerCellReactorFactory参数是元组而不是,就可以使代码更甜美

  self.offerCellReactorFactory($ 0.0,$ 0.1) 

我们可以写

  self.offerCellReactorFactory($ 0,$ 1) 

那就对了! 元组的元素是函数的独立参数,因此闭包中不需要丑陋的点符号。

这是真正的魔术发生的地方。 类型推断是语言自动检测表达式类型的能力。 在声明变量时,我们每天都在使用它,但是它具有更强大,更漂亮的应用程序。

还记得我们的UIViewController.viewDidAppear声明吗? 该viewDidAppear变量存储一个函数,Swift能够理解该函数是什么。 很酷,但还有更多。

首先, Array的map函数采用一个非转义的闭包作为参数,因此不需要[unown self]。

现在,注意指针,第三行变成

  .map(offerCellReactorFactory) 

妈呀 在这里,类型推断为我们完成了所有工作。 Swift能够找出该特定表达式中的所有类型,因为我们的元组为该函数形成正确的参数,并且map本身采用了将元组转换为某种东西的函数。

我们只是节省了自己的打字时间。 此功能具有许多优点,从涉及重命名的较少键入和易于重构开始,到使用类型正确的表达式结束。 希望,这也阐明了为什么类型转换和强制转换很差的问题

谈论重命名…让我们将offerCellReactorFactory重命名为makeOfferCellReactor🙂

看看我们如何在第2行和第3行中应用两个映射函数。这种应用称为管道

实际上,可以将管道调用应用于某些值的一系列函数。 坦白说,我们的问题是功能的流水线应用。 但是此应用程序被变量声明破坏了。 这不好吗? 不,不是真的,但是Array不仅是像Int这样的普通类型。

数组是容器类型。 它通常封装许多元素,并且该数目在计算过程中可能会发生变化。 这被称为非确定性行为。 为了保留不确定性, 数组类型具有特定的属性。 他们为我们提供了我们刚刚描述的出色的管道应用程序功能。

您是否注意到地图返回了另一个Array ? 这样可以进一步应用诸如mapcompactMapappend等功能。 对于容器类型,这种链式应用是常见的。 这意味着我们可以在不中断流程的情况下应用函数,以简单明了的方式描述我们的计算。

让我们看一下ArrayremoveAll(where 🙂函数。 您可能会注意到这是我们的链条管道中断的地方。 问题在于该函数会改变其操作的值。

在现代软件开发中,可变性没有错。 可变数据在速度,内存等方面确实表现出色,但是不合理地使用可变类型会对程序以及开发人员造成痛苦的后果。

因此,让我们以地图的方式实施我们的版本removeAll(where 🙂

如您所见,代码审查是功能非常强大的工具。 给定一个简单的问题,例如两个数组的串联,我们可以在Swift中发现多个功能。 我们发现元组不仅是另一个列表结构,还是Swift中的基础类型,它具有多个应用程序。 任何函数的参数都构成一个元组。 我们可以像对待任何参数一样在闭包中对待元组成员。

Swift的静态类型系统启用类型推断 ,这是一种为我们检测类型的强大功能。 因此,我们可以在其他函数中传递函数而无需键入参数和参数名称! 为了明智地使用此功能,我们应该给函数提供明确的名称。

数组本身不是像Int这样的普通类型。 数组计算保留类型的不确定行为并启用流水线功能应用程序。

所有这些功能使我们可以减少键入次数,并编写清晰,简单的代码。 由于Swift不是纯函数式语言,因此没有必要和可能性以这种方式设计整个项目。 功能挂钩只是工具箱中的另一个强大工具,因此在需要时使用它们,而不是在需要时使用它们。

谢谢阅读! 一件事thing

  • 是的,我们可以将类型推断用于
  .map {(OfferViewModel(from:$ 0),String($ 0.ad.id ?? 0))} 

但这值得单独发表。

  • 我们可以使用filter而不是实现我们自己的功能,但是这个示例更具说明性。
  • Array的容器类型关联只是我见过的Monad的最简单解释。 因此,在没有深入知识和漂亮抽象概念的情况下,我们描述了管道应用及其优势。