作者:Thomas Hanning,原文链接,原文日期:2016-04-25
译者:way;校对:星夜暮晨;定稿:千叶知风

Swift 提供了很多方便的函数来操作数组,比如 filtermap。在这篇文章里,我将带大家熟悉一下 filter,以及学习如何使用 map 来组合出新的数组。

假设你有一个数组,接着你想要创建一个新的数组,这个数组包含原数组中所有大于 10 的元素,你可以使用下面的 for 循环:


let anArray = Array(1...20)var anotherArray = [Int]()for i in anArray {if i > 10 {anotherArray.append(i)}
}print(anotherArray) // [11,12,13,14,15,16,17,18,19,20]

除了代码多点,也没什么问题。

Filter

但是你可以尝试使用一下 filter 函数,这是 Swift 为每个数组提供的一个新式武器,可以大大缩减枚举的代码量:


let anotherArray = anArray.filter({ (a:Int) -> Bool inreturn a > 10
})print(anotherArray)

该函数带一个闭包做为参数,这个闭包将数组中的元素作为参数,并返回一个 bool 结果。数组中的每一个元素都会执行该闭包,根据返回的结果来决定是否应存在于新的数组中。

通过 Swift 提供的闭包简化写法,我们可以进一步精简:


let anotherArray = anArray.filter ({$0 > 10})print(anotherArray) // [11,12,13,14,15,16,17,18,19,20]

和最初的版本对比一下,是不是精简了许多呢:)。

使用 map 来组合

数组还提供了一个有趣的函数 map,该函数同样是带一个闭包作为参数并且在内部返回一个经过转换的元素。所以我们先筛选出数组中所有大于 10 的元素,然后让它们的值翻一倍:


let anArray = Array(1...20)let anotherArray = anArray.filter({$0 > 10}).map({$0 * 2})print(anotherArray) // [22, 24, 26, 28, 30, 32, 34, 36, 38, 40]

关于 map 更多的细节,可以查看我此前写的一篇文章

当然你只能在条件不太复杂时这么做,如果情况比较复杂,这种写法将使代码变得更加难读。大体来说就是,如果为了可读性,那么多写点代码还是值得的。

本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 http://swift.gg。

Swift 中的过滤器相关推荐

  1. 在幕后看看Swift中的Map,Filter和Reduce的实现

    一个函数接受一些输入,对它做一些事情并创建一个输出.功能有签名和正文.如果为函数提供相同的输入,则始终获得相同的输出.简而言之,这是函数的定义. 现在我们将通过仔细研究它们来讨论更多功能.我们将在Sw ...

  2. 如何在Swift中串联或合并数组?

    本文翻译自:How do I concatenate or merge arrays in Swift? If there are two arrays created in swift like t ...

  3. 如何在Swift中使用CoreData设置有用的自动完成UITextField

    by Emrick Sinitambirivoutin 由Emrick Sinitambirivoutin 如何在Swift中使用CoreData设置有用的自动完成UITextField (How t ...

  4. 解决Swift中present(uiImagePickerController,animated: true,completion: nil)闪退的问题

    swift中开发选择图片上传,会使用到Tap Gesture Recognizer控件,对应 UITapGestureRecognizer API,以下是代码示例(取自IOS developer li ...

  5. Swift 中使用 SQLite——批量更新(事务处理)

    本文是Swift 中使用 SQLite系列的收官之作,介绍一下在数据库中的批量更新. 事务 在准备做大规模数据操作前,首先开启一个事务,保存操作前的数据库的状态 开始数据操作 如果数据操作成功,提交事 ...

  6. Swift 中使用 SQLite——打开数据库

    关于Swift中使用SQLite,接下来可能会分别从打开.增.删.改.查,几个方面来介绍SQLite的具体使用,这一篇重点介绍一下如何打开. 定义全局数据库访问句柄 /// 全局数据库访问句柄 pri ...

  7. 探索 Swift 中的 MVC-N 模式

    作者:Marcus Zarra(twitter:@mzarra) Marcus 将会为大家介绍一种设计模式,他曾经在那些需要从互联网进行大量频繁数据请求的 iOS 应用当中使用此设计模式.这个设计采用 ...

  8. Swift 中的内存管理详解

    这篇文章是在阅读<The Swift Programming Language>Automatic Reference Counting(ARC,自动引用计数)一章时做的一些笔记,同时参考 ...

  9. 怎样在swift中创建CocoaPods

    本文由yake_099(博客)翻译自raywenderlich,作者:Joshua Greene 原文:How to Create CocoaPods with Swift 你可能对一些比较著名的开源 ...

最新文章

  1. CentOS下用yum命令安装jdk
  2. occam‘s razor
  3. Nginx配置同时适配电脑和移动端设备
  4. android 克隆对象,克隆会破坏单例对象吗?
  5. mysql 二进制日志在哪_如何通过Mysql的二进制日志恢复数据库数据
  6. DPMM的理解、公式推导及抽样
  7. ASP.NET Core管道深度剖析
  8. 业务测试用例模版与大数据测试用例模板
  9. php跨域有那些方法,PHP跨域访问的3种方法
  10. Docker - 分布式任务调度中心 - xxl-job
  11. elcipse开发android locat一会显示一会消失的问题
  12. 【Python】python转义字符
  13. Java实现桐桐的数学难题
  14. [data engineering] (一)数据工程师的工作内容以及需要的软硬实力
  15. APP的文件数据直传腾讯云COS实践
  16. phpmail通过qq发邮箱失败_PHP中利用PHPMailer配合QQ邮箱实现发邮件
  17. 3.6.2数据库系统-范式判断:范式分类、第一范式、第二范式、第三范式、BC范式
  18. StartlsBack 导致屏幕闪烁的解决方法
  19. CSS学习笔记——精灵图(sprite)
  20. Cadence Allegro PCB 切换上次视图的方法图文教程及视频演示

热门文章

  1. 2015年10月18日-10月24日课程作业(HA Cluster)
  2. http://longshuai2007.blog.163.com/blog/static/1420
  3. 标签地址src路径拼接_第二十四天HTML一些常见的标签
  4. python字符串的删除操作_Python字符串操作
  5. SVN+网站服务器同步更新
  6. Android恢复出厂设置流程分析【Android源码解析十】
  7. Android Intent组件使用
  8. 《『若水新闻』客户端开发教程》——18.自定义TextView(1)
  9. The operation cannot be completed. See the details.
  10. 将gitee远程仓库抓取(克隆)到本地仓库