iOS_Swift高阶函数
iOS_Swift高阶函数
1. 基础知识
1.1 定义
高阶函数:higher-order function
如果一个函数:
- 接受一个或多个函数当作参数
- 把一个函数当作返回值
那么这个函数就被称做高阶函数。
例如:
let numbers = [1, 4, 2, 3]
let res = numbers.sort {$0 < $1
}
看着不像是函数作为参数,是因为 Swift 尾随闭包 Trailing Closure 的特性。Swift 允许当函数的最后一个参数是闭包时,可以以紧跟 { } 的形式,将最后一个闭包的内容附加在函数后面。
所以,以下两行代码是等价的:
// 正常写法,函数是作为 sort 的参数
arr.sort({ $0 < $1 })// Trailing Closure 写法,更简洁明了
arr.sort { $0 < $1 }
1.2 闭包语法
// 完整语法
nums.map({ (value: Int) -> Int in return value * 2 })
// 闭包语法
nums.map{ (value: Int) -> Int in return value * 2 }
// 省略返回值类型
nums.map{ (value: Int) in return value * 2 }
// 省略参数类型
nums.map{ value in return value * 2 }
// 省略 return
nums.map{ value in value * 2 }
// 省略参数
nums.map{ $0 * 2 }
2. 高阶函数
2.1 map
2.1.1 集合类使用
遍历集合处理后,组成新的集合
// 将数组中的字符串转换为小写字母
let cast = ["Vivien", "Marlon", "Kim", "Karl"]
let lowercaseNames = cast.map { $0.lowercased() }
print(lowercaseNames) // ["vivien", "marlon", "kim", "karl"]// 获得数组中字符串的长度
let letterCounts = cast.map { $0.count }
print(letterCounts) // [6, 6, 3, 4]
2.1.2 Optional使用
Optional 也可以使用 map:
let num: Int? = 2
var res = num.map { $0 * 2 }
print(res)/// 而不需要像以下这样解包
if let num = num {res = num * 2
} else {res = nil
}
2.1.3 map 时获得 index
需要在 map 前使用 enumerated:
let indexRes = cast.enumerated().map{ (index, element) inreturn "\(index):\(element)"
}
print(indexRes)
2.2 compactMap
Array 和 Set 使用 compactMap 可获得非空集合:
let possibleNumbers = ["1", "2", "three", "///4///", "5"]let mapped = possibleNumbers.map { Int($0) }
print(mapped) // [Optional(1), Optional(2), nil, nil, Optional(5)]// compactMap 获得非 optional 元素
let compactMapped = possibleNumbers.compactMap { Int($0) }
print(compactMapped) // [1, 2, 5]
Dictionary 得用 compactMapValues 如下。
2.3 compactMapValues
Dictionary 使用 compactMapValues 可获得非空的键值对集合:
let dict = ["a": "1", "b": "three", "c": "///4///"]let maped = dict.mapValues { Int($0) }
print(maped) // ["a": Optional(1), "b": nil, "c": nil]let compactMaped = dict.compactMapValues { Int($0) }
print(compactMaped) // ["a": 1]
2.4 flatMap
flatMap 可将多维的集合,降低为一维:
let dict = ["Momo": [1, 2, 3], "Bibi": [4, 5, 6]]
let res1 = dict.map { $0.value }
print(res1) // [[4, 5, 6], [1, 2, 3]]let res2 = dict.flatMap { $0.value }
print(res2) // [4, 5, 6, 1, 2, 3]
2.5 filter
filter 可过滤出符合条件的元素集合
// 过滤字符串长度小于5的
let cast = ["Vivien", "Marlon", "Kim", "Karl"]
let shortNames = cast.filter { $0.count < 5 }
print(shortNames) // ["Kim", "Karl"]
2.6 reduce
reduce 可对集合遍历累积处理结果:
// 计算所有元素和
let numbers = [1, 2, 3, 4]
let res = numbers.reduce(0, { x, y in// 第一个参数为上次处理结果// 第二个参数为当前遍历到的元素x + y
})
print(res) // 10
3.练习
3.1 用 reduce 实现 map
let arr = [1, 3, 2]
let res = arr.reduce([]) { (a: [Int], element: Int) -> [Int] invar tmp = Array(a)tmp.append(element * 2)return tmp
}
// res = [2, 6, 4]
关键点:result 用数组
3.2 用 reduce 一次求出数组中奇数的和、以及偶数乘积
let arr = [1, 3, 2, 4]
let res: (Int, Int) = arr.reduce((0, 1)) { (a :(Int, Int), element: Int) -> (Int, Int) inif element % 2 == 0 {return (a.0, a.1 * element)} else {return (a.0 + element, a.1)}
}
// res = (4, 8)
关键点:result 用元组表示
3.3 使用高阶函数求一个数组中偶数的平方和
let arr = [1, 3, 2, 4]
let res = arr.filter {$0 % 2 == 0}.map {$0 * $0}.reduce(0) {$0 + $1}
Reference:
Apple Documentation for swift
Swift 烧脑体操(三) - 高阶函数
深入浅出Swift高阶函数-Map、Filter、Reduce
swift小知识点之高阶函数之map, filter, reduce
相关文章:
iOS_Swift高阶函数
iOS_Swift高阶函数 #mermaid-svg-NxX1czIESDq47OQw {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NxX1czIESDq47OQw .error-icon{fill:#552222;}#mermaid-svg-NxX1czIESDq47OQw .error-text{fill:#552222;stroke:#…...
探索Vue的组件世界-组件复用
目录 Mixin【混入】 缺陷 HOC(higher order component)【高阶组件】 相比较Mixin的优点: 不足: Renderless组件【函数式组件,无渲染组件,Vue社区使用比较多的一种业务复用模式】 优点: M…...
OMA通道-2
1 简介 本文档中指定的 API 使移动应用程序能够访问移动设备中的不同 SE,例如 SIM 或嵌入式 SE。 本规范提供了接口定义和 UML 图,以允许在各种移动平台和不同的编程语言中实现。 如果编程语言支持命名空间,则它应为 org.simalliance.openmob…...
SAP 用CO13冲销工序报工,但是没有产生货物移动(TCODE:CO1P 、 SE38 :CORUPROC,CORUAFWP)
前言 通常情况下,对PPO做GI或GR的时候,出现的异常可以在COGI中间被列出;在这些数据进入COGI之前,系统会把这些数据记录在CO1P中;换句话说,系统有时会出现DB的更新延时,当延时发生的时候…...
信息收集-服务器信息
服务器上面可以运行大量的系统服务和第三方应用服务,如果操作系统或者第三方软件没有及时升级打补丁,攻击者就有可能直接通过服务器上运行的服务进行攻击。 服务器需要收集的信息包含三个方面: 操作系统信息等识别waf(Web应用程…...
连续签到积分兑换试用流量主小程序开发
每日签到积分兑换试用流量主小程序开发 打卡兑奖小程序。用户签到活得积分。积分可以兑换商品。观看激励视频广告可以积分翻倍。 用户可以参加试用商品活动参加试用需要提交信息。可以通过分享方式直接获取试用资格。 以下是流量主小程序的功能列表: 广告位管理&a…...
C语言—自定义类型(结构体、枚举、联合)
自定义类型 结构体结构体的声明特殊的声明结构的自引用结构体变量的定义和初始化结构体内存对齐修改默认对齐数offsetof宏 结构体传参 位段位段的定义(声明)位段的内存分配位段的跨平台问题位段的应用 枚举枚举类型的定义及使用枚举的优点 联合ÿ…...
Node.js博客项目开发思路笔记
博客项目介绍 1. 目标 开发一个博客系统,具备博客基本功能只开发 server 端,不关心前端 2. 需求 首页、作者页、博客详情页登陆页管理中心、新建页、编辑页 3. 技术方案 数据如何存储 博客 idtitlecontentcreatetimeauthor1标题 1内容 11111112z…...
python 之 shutil 文件的复制、删除、移动文件以及目录,并支持文件的归档、压缩和解压
一、shutil shutil 模块于文件和文件集合的高级操作,包括:复制、删除、移动文件以及目录,并支持文件的归档、压缩和解压等 二、使用例子 复制文件及权限 shutil.copy(src, dst)复制文件及权限;src 和 dst 文件路径。dst 文件名或…...
jface
JFace 是建立在 SWT 之上的 UI 部件,它是 SWT 的扩展并能和SWT交互。 ApplicationWindow和Action org.eclipse.jface.window.ApplicationWindow; JFace为了简化窗口的设计特别设计了类,比如ApplicationWindow这一个类,它里面包含了六个默认…...
六级备考28天|CET-6|听力第一讲|基本做题步骤与方法|13:30~14:30
目录 1. 重点词汇 proofread / ˈpruːfriːd / v.校对,校阅 autonomous adj.独立的 obsession n. 喜好 ample …...
系统设计 - 设计一个速率限制器
实施速率限制器的位置主要取决于我们的应用程序、技术栈、技术团队等因素。通常有三个位置可供选择:客户端、服务器端或中间件。 客户端是不可靠的地方来执行速率限制,因为恶意行为者可以轻易伪造客户端请求。 比将速率限制器放在服务器端更好的方法是使…...
[技术分享]Android平台实时音视频录像模块设计之道
实现背景 录像有什么难的?无非就是数据过来,编码保存mp4而已,这可能是好多开发者在做录像模块的时候的思考输出。是的,确实不难,但是做好,或者和其他模块有非常好的逻辑配合,确实不容易。 好多…...
JDKMissionControl官方用户指南--人工翻译
1. JMC8新增功能 暂时用不到,暂略 2. JDK Mission Control是什么 JMC是一组高级工具,用于管理、监视、分析Java应用程序并排除其故障。JMC能够对代码性能、内存和延迟等领域进行高效而详细的数据分析,而不会引入通常与分析和监控工具相关的…...
MySql-高级(分库分表问题简析) 学习笔记
文章目录 1. 为什么要分库分表?2. 用过哪些分库分表中间件?不同的分库分表中间件都有什么优点和缺点?3. 你们具体是如何对数据库如何进行垂直拆分或水平拆分的?4. 分库分表时,数据迁移方案5. 如何设计可以动态扩容缩容…...
【5.20】五、安全测试——安全测试工具
目录 5.4 常见的安全测试工具 1. Web漏洞扫描工具——AppScan 2. 端口扫描工具——Nmap 3. 抓包工具——Fiddler 4. Web渗透测试工具——Metasploit 小提示:Kali Linux 5.4 常见的安全测试工具 安全测试是一个非常复杂的过程,测试所使用到的工具也…...
【13900k】i9 核显升级驱动
这里写自定义目录标题 官方的助手不能用显卡控制中心提示最新的更新搜索显卡 intel uhd graphics 770 手动下载安装自定义音频为啥也要卸载?新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片…...
使用Python将绿色转换为红色、红色转换为蓝色的图像处理
使用Python将绿色转换为红色、红色转换为蓝色的图像处理 在图像处理中,我们经常需要对图像进行颜色转换和修改。本篇博客介绍了如何使用Python的Pillow库来读取一个文件夹中的所有图像,并将其中的绿色转换为红色,红色转换为蓝色。我们还展示…...
Web2与Web3开发的不同之处
Web2是引入交互功能的第二代互联网,也是我们今天所熟悉的。随着Web的不断发展,第三代互联网,也被称为Web3,正处于积极开发中。Web3引入了在区块链上运行的去中心化和无需许可的系统。但是Web2和Web3开发之间有什么区别呢ÿ…...
递增数组的判断【python实现】
有时候需要对某一组数组的数据进行判断是否 递增 的场景,比如我在开发一些体育动作场景下,某些肢体动作是需要持续朝着垂直方向向上变化,那么z轴的值是会累增的。同理,逆向考虑,递减就是它的对立面。 下面是查找总结到…...
OpenClaw安全防护指南:Qwen3-14B私有镜像下的权限管控实践
OpenClaw安全防护指南:Qwen3-14B私有镜像下的权限管控实践 1. 为什么需要关注OpenClaw的安全防护? 去年我在尝试用OpenClaw自动化处理财务报表时,曾遭遇过一次"惊魂时刻"——脚本误将未加密的财务数据上传到了临时目录。这次经历…...
Pixel Epic部署指南:Ubuntu/CentOS多系统兼容性部署与故障排查
Pixel Epic部署指南:Ubuntu/CentOS多系统兼容性部署与故障排查 1. 产品概述 Pixel Epic(像素史诗智识终端)是一款基于AgentCPM-Report大模型构建的创新研究报告辅助工具。与传统AI工具不同,它将枯燥的科研过程转化为充满游戏感的…...
PDF-Extract-Kit-1.0在Linux系统下的高效部署指南
PDF-Extract-Kit-1.0在Linux系统下的高效部署指南 1. 开篇:为什么选择PDF-Extract-Kit? 如果你经常需要从PDF文档中提取内容,肯定遇到过各种头疼的问题:格式错乱、表格识别不准、公式无法提取、排版复杂难以处理。PDF-Extract-K…...
电源环路分析仪不会用?2026年硬件工程师的必备技能该补上了
电源环路分析仪不会用?2026年硬件工程师的必备技能该补上了实验室里,Buck电源刚调通,输出纹波看着也不错,但一上动态负载,输出电压就开始剧烈振荡。换了几组补偿参数,还是没找到症结所在。这时候,旁边有经验的前辈说了一句:"你测过环路稳定性吗?"说实话,…...
PyTorch-OpCounter终极指南:10个常见问题快速解决模型计算量统计难题
PyTorch-OpCounter终极指南:10个常见问题快速解决模型计算量统计难题 【免费下载链接】pytorch-OpCounter Count the MACs / FLOPs of your PyTorch model. 项目地址: https://gitcode.com/gh_mirrors/py/pytorch-OpCounter PyTorch-OpCounter(TH…...
ThingsBoard设备告警实战:从MQTTX模拟数据到RabbitMQ消息队列的完整流程
ThingsBoard设备告警实战:从MQTTX模拟数据到RabbitMQ消息队列的完整流程 最近在部署一个工业温度监控系统时,遇到了设备告警实时性不足的问题。传统的轮询方式不仅效率低下,还经常错过关键告警。经过多次尝试,最终通过ThingsBoar…...
SEO_从零开始,手把手教你制定SEO优化方案(237 )
SEO从零开始:初学者手把手教你制定SEO优化方案 在数字化时代,搜索引擎优化(SEO)已经成为了网站流量获取的重要途径之一。无论你是新开网站的小主人,还是希望提升现有网站排名的企业,掌握SEO优化方案的基本…...
倩女幽魂手游全自动24小时系统|雷电模拟器多线程中控+自动倒米交易+智能喊话器(含易语言源码)
温馨提示:文末有联系方式全自动全天候运行,毫秒级响应不中断 本方案实现真正意义上的24小时无人值守全自动运行,所有操作基于精准时间戳与事件触发机制,确保交易指令0延迟下发,告别卡顿与漏单,大幅提升倒米…...
三进制计算机:从数学理论到工程实践
1. 三进制计算机的数学基础1.1 进制效率的理论探讨在计算机科学领域,进制选择本质上是一个信息编码效率的问题。1948年,香农在他的开创性论文《通信的数学理论》中首次提出了信息熵的概念,这为我们理解不同进制的编码效率提供了理论基础。让我…...
CSMS详细学习,CIA网络安全接口协议和CSMS的关系
CSMS详细学习,CIA网络安全接口协议和CSMS的关系 一、CSMS的定义与核心目标 CSMS(Cybersecurity Management System) 是由 UN R155法规 强制要求建立的一套组织级网络安全管理体系。其本质是通过制度化的流程、策略和资源分配,确保…...
