请选择 进入手机版 | 继续访问电脑版

[Swift] 深入浅出的聊聊Swift高阶函数

[复制链接]
查看127 | 回复11 | 2021-9-14 14:10:32 | 显示全部楼层 |阅读模式
目次

初探高阶函数

在 Swift 中,高阶函数一共有下面几个:

  • map:对给定数组每个元素,实行 闭包中的映射,将映射结果 放置在数组中返回。
  • flatMap:对给定数组的每个元素,实行 闭包中的映射,对映射结果 举行 合并操作,然后将合并操作后的结果 放置在数组中返回。
  • compactMap:对给定数组的每个元素,实行 闭包中的映射,将非空的映射结果 放置在数组中返回。
  • compactMap对给定数组的每个元素,实行 闭包中的映射,将非空的映射结果 -键值对放置在字典中返回。
  • filter:对给定数组的每个元素,实行 闭包中的操作,将符合条件的元素放在数组中返回。
  • reduce:对给定数组的每个元素,实行 闭包中的操尴尬刁难 元素举行 合并,并将合并结果 返回。

通过上面的阐述,我们大概相识 到了这几个函数是做什么用的,下面我们在通过几个例子来详细 看一下代码上怎样 使用 。

map

对于 map 函数,使用 场景就是将数组的范例 映射为别的范例 。比如,我们有一个模子 数组,模子 的 id 字段我们从服务器拿的是 String 范例 ,在某种场景下我们必要 转为 Int 范例 ,这时间 我们就可以通过 map 函数来实现该需求。

  1. struct Student {
  2. let id: String
  3. let name: String
  4. let age: Int
  5. }
  6. let stu1 = Student(id: "1001", name: "stu1", age: 12)
  7. let stu2 = Student(id: "1002", name: "stu2", age: 14)
  8. let stu3 = Student(id: "1003", name: "stu3", age: 16)
  9. let stu4 = Student(id: "1004", name: "stu4", age: 20)
  10. let stus = [stu1, stu2, stu3, stu4]
  11. let intIds = stus.map { (stu) in
  12. Int(stu.id)
  13. }
  14. print(intIds) //[Optional(1001), Optional(1002), Optional(1003), Optional(1004)]
复制代码

通过上述代码,我们将 id 字段从 String 映射为了 Int? 范例 ,这并不是我们想要的 Int 范例 。假如 我们必要 访问元素的话还得必要 解包,那么我们怎样 既能将元素映射又能自动 筛选 nil 的值呢?这时,就轮到 compactmap 出马了。

compactMap

我们将上面的代码更换 为:

  1. let intIds = stus.compactMap { (stu) in
  2. Int(stu.id)
  3. }
复制代码

这时,我们再打印 intIds 就会发现它已经为 Int 范例 了。

compactMapValues

对于 Set 和 Array ,你可以使用 compactMap 来获得非空的集合,但是对于 Dictionary 来说,这个函数是不起作用的。

  1. let dict = ["key1": 10, "key2": nil]
  2. let result = dict.compactMap { $0 }
  3. print(result) //[(key: "key1", value: Optional(10)), (key: "key2", value: nil)]
复制代码

这时间 ,我们必要 使用 compactMapValues 函数来获得非空的字典。

  1. print(result) //["key1": 10]
  2. let result = dict.compactMapValues { $0 }
  3. print(result) //["key1": 10]
复制代码

flatMap

对于 flatMap,重要 的应用场景就是你想获得一个单层集合的数组。通过下面的代码来看一下 map 和 flapMap 的区别。

  1. let scoresByName = ["Henk": [0, 5, 8], "John": [2, 5, 8]]
  2. let mapped = scoresByName.map { $0.value }
  3. // [[2, 5, 8], [0, 5, 8]]
  4. print(mapped)
  5. let flatMapped = scoresByName.flatMap { $0.value }
  6. // [2, 5, 8, 0, 5, 8]
复制代码

map 会直接将元素放在数组中,而 flatMap 会将元素平铺在一个数组中。现实 上,s.flatMap(transform) 等同于s.map(transform).joined()。

filter

这个函数就如同 单词的意思:查找。将符合条件的元素查找出来放置在数组中返回。比如我们想查找年岁 大于18岁的全部 弟子 。

  1. let adults = stus.filter { (stu) -> Bool in
  2. stu.age >= 18
  3. }
  4. print(adults) // 数组中只包含stu4 学生
复制代码

reduce

对于 reduce,我们的使用 场景就是对数组中的元素举行 组合运算,比如我们想计算全部 弟子 的年岁 加载一起是多少。

  1. let totalAges = stus.reduce(0) { (result, stu) in
  2. return result + stu.age
  3. }
  4. print(totalAges) // 62
复制代码

该函数的第一个参数为初始值,后面元组中的第一个参数为每次计算的结果 ,第二个参数为每次遍历的元素。末了 将计算的结果 返回。

组合使用

对于使用 高阶函数最大的好处就是可以举行 函数式编程了。下面我们通过几个小栗子来对这几个高阶函数举行 组合使用 。

将 String 范例 映射为 Int 范例 ,并查找id大于1002的全部 弟子

  1. let adults = stus.compactMap { (stu) in
  2. Int(stu.id)
  3. }.filter { (id) -> Bool in
  4. id > 1002
  5. }
  6. print(adults) //[1003, 1004]
复制代码

计算年岁 大于12的全部 弟子 年岁 总和

  1. let totalAge = stus.filter { (stu) -> Bool in
  2. stu.age > 12
  3. }.reduce(0) { (result, stu) in
  4. return result + stu.age
  5. }
  6. print(totalAge) // 50
复制代码

总结

到此这篇关于Swift高阶函数的文章就先容 到这了,更多相干 Swift高阶函数内容请搜索 脚本之家从前 的文章或继续欣赏 下面的相干 文章盼望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 123457021 | 2021-9-21 05:00:18 | 显示全部楼层
吹牛的人越来越多了!
回复

使用道具 举报

avatar 123456790 | 2021-9-27 03:10:17 | 显示全部楼层
今天是个特别的日子,值得纪念!
回复

使用道具 举报

avatar 落叶的时节 | 2021-9-27 03:10:21 | 显示全部楼层
今天怎么了,什么人都出来了!
回复

使用道具 举报

avatar 换即势 | 2021-10-4 10:07:45 | 显示全部楼层
以后就跟admin楼主混了!
回复

使用道具 举报

avatar 涵涵爸爸520 | 2021-10-7 05:31:44 | 显示全部楼层
我回帖admin楼主给加积分吗?
回复

使用道具 举报

avatar 迟到399 | 2021-10-8 18:15:04 | 显示全部楼层
太高深了,理解力不够用了!
回复

使用道具 举报

avatar 123457210 | 2021-10-9 19:35:52 | 显示全部楼层
学习雷锋,好好回帖!
回复

使用道具 举报

投admin楼主一票,不用谢哦!
回复

使用道具 举报

对牛弹琴的人越来越多了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则