Swift通过Zip,Map和Reduce进行有用的操作

今天的文章是Swift中的zip,map和reduce函数。 让我们介绍一下您在编码工作中可能遇到的一个典型问题。

问题陈述

您正在使用学校评分应用程序,该应用程序允许教师监视学生的进度。 您可以获得有关班级中每个学生的信息以及他们的作业和测验成绩。 所有这些信息都可以存储并可以用JSON检索,这意味着您最终可以拥有结构化的数组和数据字典。

到目前为止,一切都很好。 但是,你的老板想要改变。 她已要求您给老师更多的方法来分析学生的表现。 尽管可以在服务器上完成此工作,但她希望看到客户端应用程序中已完成的功能以最大程度地减少网络流量以及其他一些她没有详细说明的原因。

免责声明-这是一个人为的示例,我们将简化一些假设,以使问题与zip,map和reduce上的课程一起解决。

让我们看一下如何开始使用zip,map和reduce函数来解决其中的一些挑战。

压缩

zip方法允许您使用数组,集合,字典(或符合SequenceType协议的任何类型)来从两个基础的序列中构建SequenceType 。 让我们分解一下。

SequenceType是一种协议,它允许类型使用for…in循环。 内置的收集类型是SequenceType的示例。 在下一级上, SequenceType协议定义了一个名为Generator (称为GeneratorType )的关联类型,该类型用于提供迭代功能以获得序列中的下一个Element 。 将所有这些放在一起,zip方法将创建一个对对序列,其中第i个对由每个基础序列处的索引值组成。 让我们举一个例子。

假设您有两个要相互关联的数组。 例如,您有一个学生姓名数组和一个与那些学生索引相匹配的成绩阵列。 如何创建一个将每个索引的学生和年级合并在一起的列表? 您猜对了,我们可以使用zip方法将它们组合在一起。 请参见下面的代码。

地图

每个SequenceType都有一个map方法,该方法将遍历其序列并在每个项目上调用传入的转换函数-收集结果并将其作为新数组返回。 使用map函数,可以将一种类型的数组转换为另一种类型的数组。 请参见下面的map方法签名:

func map (@ noescape _ transform:(Self.Generator.Element)-> T)-> [T]

约束条件

Self:_CollectionWrapperType,Self.Index == Self.Base.Index

从前面的示例扩展,我们可以进一步格式化zip方法输出的结果以包括字母等级,并将结果转换为可通过其键访问的字典。

降低

reduce方法通过重复调用序列中的每个项目并传递一个Combine函数来累加值来返回单个结果。

func reduce (_初始:T,@noescape合并组合:(T,Self.Generator.Element)-> T)-> T

当您需要将数据点的集合煮沸成单个值时,reduce方法非常方便。 例如,知道有多少个A授予我们的学生会很有趣。 参见以下示例。

在上面的代码中,我们使用reduce方法从初始值零开始,并在每次找到“ A”字母等级时将其加到运行总计中。

最后的想法

希望您可以看到zip,map和reduce方法在实践中如何有所帮助。 这些方法中的每一个都源于函数式编程,应该使您编写更清晰的代码,这些代码更易于理解,并且只有很少的代码行。

简要地说,我还写了一篇文章,说明为什么创建本地应用程序可能是大多数移动开发工作中最好的方法。 请阅读该内容并在讨论中权衡!

您的混合应用程序将杀死您
如果您的公司仅开发混合应用程序,那么最终您将蒙受损失。 这只是时间问题。 混合手机… medium.com

如果您发现这篇文章有帮助,请推荐给其他人阅读。 您可以访问我的网站www.gittielabs.com并订阅我的RSS feed,这样您就不会错过任何帖子。 我还将整理一个视频课程来教授Swift开发,并可以在您认为会有所帮助的主题上使用您的意见。 谢谢阅读!