千家信息网

Swift高阶函数有哪些

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,小编给大家分享一下Swift高阶函数有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!初探高阶函数在 Swift 中,高
千家信息网最后更新 2026年10月31日Swift高阶函数有哪些

小编给大家分享一下Swift高阶函数有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

初探高阶函数

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

  • map:对给定数组每个元素,执行闭包中的映射,将映射结果放置在数组中返回。

  • flatMap:对给定数组的每个元素,执行闭包中的映射,对映射结果进行合并操作,然后将合并操作后的结果放置在数组中返回。

  • compactMap:对给定数组的每个元素,执行闭包中的映射,将非空的映射结果放置在数组中返回。

  • compactMap对给定数组的每个元素,执行闭包中的映射,将非空的映射结果-键值对放置在字典中返回。

  • filter:对给定数组的每个元素,执行闭包中的操作,将符合条件的元素放在数组中返回。

  • reduce:对给定数组的每个元素,执行闭包中的操作对元素进行合并,并将合并结果返回。

通过上面的阐述,我们大概了解到了这几个函数是做什么用的,下面我们在通过几个例子来具体看一下代码上如何使用。

map

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

struct Student {    let id: String    let name: String    let age: Int} let stu1 = Student(id: "1001", name: "stu1", age: 12)let stu2 = Student(id: "1002", name: "stu2", age: 14)let stu3 = Student(id: "1003", name: "stu3", age: 16)let stu4 = Student(id: "1004", name: "stu4", age: 20)let stus = [stu1, stu2, stu3, stu4] let intIds = stus.map { (stu) in    Int(stu.id)} print(intIds) //[Optional(1001), Optional(1002), Optional(1003), Optional(1004)]

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

compactMap

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

 let intIds = stus.compactMap { (stu) in     Int(stu.id)   }

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

compactMapValues

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

let dict = ["key1": 10, "key2": nil]let result = dict.compactMap { $0 }print(result) //[(key: "key1", value: Optional(10)), (key: "key2", value: nil)]

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

  print(result) //["key1": 10] let result = dict.compactMapValues { $0 } print(result) //["key1": 10]

flatMap

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

  let scoresByName = ["Henk": [0, 5, 8], "John": [2, 5, 8]]  let mapped = scoresByName.map { $0.value }  // [[2, 5, 8], [0, 5, 8]]  print(mapped) let flatMapped = scoresByName.flatMap { $0.value }  // [2, 5, 8, 0, 5, 8]

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

filter

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

let adults = stus.filter { (stu) -> Bool in        stu.age >= 18       }  print(adults) // 数组中只包含stu4 学生

reduce

对于 reduce,我们的使用场景就是对数组中的元素进行组合运算,比如我们想计算所有学生的年龄加载一起是多少。

let totalAges = stus.reduce(0) { (result, stu) in        return result + stu.age        }    print(totalAges) // 62

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

组合使用

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

将 String 类型映射为 Int 类型,并查找id大于1002的所有学生

let adults = stus.compactMap { (stu) in        Int(stu.id)        }.filter { (id) -> Bool in           id > 1002        }    print(adults) //[1003, 1004]

计算年龄大于12的所有学生年龄总和

let totalAge = stus.filter { (stu) -> Bool in            stu.age > 12    }.reduce(0) { (result, stu) in   return result + stu.age   }   print(totalAge) // 50

以上是"Swift高阶函数有哪些"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

数组 元素 函数 类型 结果 高阶 闭包 学生 代码 场景 就是 年龄 参数 篇文章 面的 组合 内容 字典 字段 条件 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 博彦科技互联网金融 广东猪兼强互联网科技有限公司 科技金融是不是互联网金融 互联网电商科技 互联网科技论坛 互联网科技公司名称 人人互联网科技是培训 互联网科技股午盘股票涨跌 深圳互联网科技怎么样 北京三清互联网科技 恒银科技与互联网金融 创业天下互联网科技有限公司 以后互联网后是啥科技 互联网对科技的发展 互联网科技扶贫时间 互联网科技人工智能实验室 互联网在线教育科技创业 南博望互联网科技有限公司 艺电能源互联网科技有限公司招聘 互联网对科技影响 哈尔滨大商圈互联网科技有限公司 互联网巨头科技公司 智网互联网科技 成都仁贤领冠互联网科技有限公司 创业天下互联网科技有限公司 高科技互联网发展前景如何 工业互联网等科技实现智能化赋能 中和天地互联网科技有限公司 本届互联网大会上的黑科技 互联网科技创新方面的资料
0