当前位置: 首页 > news >正文

iOS_Swift高阶函数

iOS_Swift高阶函数

higher-order function in Swift
map 转换
compactMap set/array取非空
compactMapValues dictionary取非空
flatMap 降维
filter 过滤
reduce 处理累积

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

ArraySet 使用 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&#xff08;higher order component&#xff09;【高阶组件】 相比较Mixin的优点&#xff1a; 不足&#xff1a; Renderless组件【函数式组件&#xff0c;无渲染组件&#xff0c;Vue社区使用比较多的一种业务复用模式】 优点&#xff1a; M…...

OMA通道-2

1 简介 本文档中指定的 API 使移动应用程序能够访问移动设备中的不同 SE&#xff0c;例如 SIM 或嵌入式 SE。 本规范提供了接口定义和 UML 图&#xff0c;以允许在各种移动平台和不同的编程语言中实现。 如果编程语言支持命名空间&#xff0c;则它应为 org.simalliance.openmob…...

SAP 用CO13冲销工序报工,但是没有产生货物移动(TCODE:CO1P 、 SE38 :CORUPROC,CORUAFWP)

前言 通常情况下&#xff0c;对PPO做GI或GR的时候&#xff0c;出现的异常可以在COGI中间被列出&#xff1b;在这些数据进入COGI之前&#xff0c;系统会把这些数据记录在CO1P中&#xff1b;换句话说&#xff0c;系统有时会出现DB的更新延时&#xff0c;当延时发生的时候&#xf…...

信息收集-服务器信息

服务器上面可以运行大量的系统服务和第三方应用服务&#xff0c;如果操作系统或者第三方软件没有及时升级打补丁&#xff0c;攻击者就有可能直接通过服务器上运行的服务进行攻击。 服务器需要收集的信息包含三个方面&#xff1a; 操作系统信息等识别waf&#xff08;Web应用程…...

连续签到积分兑换试用流量主小程序开发

每日签到积分兑换试用流量主小程序开发 打卡兑奖小程序。用户签到活得积分。积分可以兑换商品。观看激励视频广告可以积分翻倍。 用户可以参加试用商品活动参加试用需要提交信息。可以通过分享方式直接获取试用资格。 以下是流量主小程序的功能列表&#xff1a; 广告位管理&a…...

C语言—自定义类型(结构体、枚举、联合)

自定义类型 结构体结构体的声明特殊的声明结构的自引用结构体变量的定义和初始化结构体内存对齐修改默认对齐数offsetof宏 结构体传参 位段位段的定义&#xff08;声明&#xff09;位段的内存分配位段的跨平台问题位段的应用 枚举枚举类型的定义及使用枚举的优点 联合&#xff…...

Node.js博客项目开发思路笔记

博客项目介绍 1. 目标 开发一个博客系统&#xff0c;具备博客基本功能只开发 server 端&#xff0c;不关心前端 2. 需求 首页、作者页、博客详情页登陆页管理中心、新建页、编辑页 3. 技术方案 数据如何存储 博客 idtitlecontentcreatetimeauthor1标题 1内容 11111112z…...

python 之 shutil 文件的复制、删除、移动文件以及目录,并支持文件的归档、压缩和解压

一、shutil shutil 模块于文件和文件集合的高级操作&#xff0c;包括&#xff1a;复制、删除、移动文件以及目录&#xff0c;并支持文件的归档、压缩和解压等 二、使用例子 复制文件及权限 shutil.copy(src, dst)复制文件及权限&#xff1b;src 和 dst 文件路径。dst 文件名或…...

jface

JFace 是建立在 SWT 之上的 UI 部件&#xff0c;它是 SWT 的扩展并能和SWT交互。 ApplicationWindow和Action org.eclipse.jface.window.ApplicationWindow; JFace为了简化窗口的设计特别设计了类&#xff0c;比如ApplicationWindow这一个类&#xff0c;它里面包含了六个默认…...

六级备考28天|CET-6|听力第一讲|基本做题步骤与方法|13:30~14:30

目录 1. 重点词汇 proofread / ˈpruːfriːd / v.校对&#xff0c;校阅 autonomous adj.独立的 obsession n. 喜好 ample …...

系统设计 - 设计一个速率限制器

实施速率限制器的位置主要取决于我们的应用程序、技术栈、技术团队等因素。通常有三个位置可供选择&#xff1a;客户端、服务器端或中间件。 客户端是不可靠的地方来执行速率限制&#xff0c;因为恶意行为者可以轻易伪造客户端请求。 比将速率限制器放在服务器端更好的方法是使…...

[技术分享]Android平台实时音视频录像模块设计之道

实现背景 录像有什么难的&#xff1f;无非就是数据过来&#xff0c;编码保存mp4而已&#xff0c;这可能是好多开发者在做录像模块的时候的思考输出。是的&#xff0c;确实不难&#xff0c;但是做好&#xff0c;或者和其他模块有非常好的逻辑配合&#xff0c;确实不容易。 好多…...

JDKMissionControl官方用户指南--人工翻译

1. JMC8新增功能 暂时用不到&#xff0c;暂略 2. JDK Mission Control是什么 JMC是一组高级工具&#xff0c;用于管理、监视、分析Java应用程序并排除其故障。JMC能够对代码性能、内存和延迟等领域进行高效而详细的数据分析&#xff0c;而不会引入通常与分析和监控工具相关的…...

MySql-高级(分库分表问题简析) 学习笔记

文章目录 1. 为什么要分库分表&#xff1f;2. 用过哪些分库分表中间件&#xff1f;不同的分库分表中间件都有什么优点和缺点&#xff1f;3. 你们具体是如何对数据库如何进行垂直拆分或水平拆分的&#xff1f;4. 分库分表时&#xff0c;数据迁移方案5. 如何设计可以动态扩容缩容…...

【5.20】五、安全测试——安全测试工具

目录 5.4 常见的安全测试工具 1. Web漏洞扫描工具——AppScan 2. 端口扫描工具——Nmap 3. 抓包工具——Fiddler 4. Web渗透测试工具——Metasploit 小提示&#xff1a;Kali Linux 5.4 常见的安全测试工具 安全测试是一个非常复杂的过程&#xff0c;测试所使用到的工具也…...

【13900k】i9 核显升级驱动

这里写自定义目录标题 官方的助手不能用显卡控制中心提示最新的更新搜索显卡 intel uhd graphics 770 手动下载安装自定义音频为啥也要卸载&#xff1f;新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片…...

使用Python将绿色转换为红色、红色转换为蓝色的图像处理

使用Python将绿色转换为红色、红色转换为蓝色的图像处理 在图像处理中&#xff0c;我们经常需要对图像进行颜色转换和修改。本篇博客介绍了如何使用Python的Pillow库来读取一个文件夹中的所有图像&#xff0c;并将其中的绿色转换为红色&#xff0c;红色转换为蓝色。我们还展示…...

Web2与Web3开发的不同之处

Web2是引入交互功能的第二代互联网&#xff0c;也是我们今天所熟悉的。随着Web的不断发展&#xff0c;第三代互联网&#xff0c;也被称为Web3&#xff0c;正处于积极开发中。Web3引入了在区块链上运行的去中心化和无需许可的系统。但是Web2和Web3开发之间有什么区别呢&#xff…...

递增数组的判断【python实现】

有时候需要对某一组数组的数据进行判断是否 递增 的场景&#xff0c;比如我在开发一些体育动作场景下&#xff0c;某些肢体动作是需要持续朝着垂直方向向上变化&#xff0c;那么z轴的值是会累增的。同理&#xff0c;逆向考虑&#xff0c;递减就是它的对立面。 下面是查找总结到…...

D3KeyHelper终极指南:5分钟掌握暗黑3最强自动化工具

D3KeyHelper终极指南&#xff1a;5分钟掌握暗黑3最强自动化工具 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面&#xff0c;可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3KeyHelper是一款专为《暗黑破坏神3…...

Linux CPU性能优化:D状态和Z状态排查与处理

文章目录一、Linux进程五大基本状态1. 运行状态&#xff08;R&#xff0c;Running / Runnable&#xff09;2. 可中断睡眠状态&#xff08;S&#xff0c;Interruptible Sleep&#xff09;3. 不可中断睡眠状态&#xff08;D&#xff0c;Uninterruptible Sleep&#xff09;4. 停止…...

终极空洞骑士模组管理器 Lumafly:跨平台一键安装与智能依赖管理指南

终极空洞骑士模组管理器 Lumafly&#xff1a;跨平台一键安装与智能依赖管理指南 【免费下载链接】Lumafly A cross platform mod manager for Hollow Knight written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/lu/Lumafly Lumafly 是一款基于 Avalonia 框…...

别再只会用strlen了!CAPL脚本字符串处理实战:从CAN报文解析到日志生成

CAPL脚本字符串处理实战&#xff1a;从CAN报文解析到日志生成在汽车电子测试领域&#xff0c;CAPL脚本是工程师们不可或缺的利器。面对复杂的CAN总线数据流&#xff0c;字符串处理能力往往决定了脚本的效率和可靠性。本文将带您超越基础API的简单调用&#xff0c;探索如何组合运…...

崩坏星穹铁道自动化终极指南:3分钟学会解放双手的游戏助手

崩坏星穹铁道自动化终极指南&#xff1a;3分钟学会解放双手的游戏助手 【免费下载链接】StarRailAssistant 崩坏&#xff1a;星穹铁道自动化 | 崩坏&#xff1a;星穹铁道自动锄大地 | 崩坏&#xff1a;星穹铁道锄大地 | 自动锄大地 | 基于模拟按键 项目地址: https://gitcode…...

Arm Cortex-M的FP和MVE

Floating-point Support目前Arm architecture支持的floating-point extension版本是FPv5。FPv5提供了以下功能&#xff1a;单精度算术运算&#xff1b;可选的双精度算术运算&#xff1b;整数、双精度、单精度、和半精度格式之间的转换&#xff1b;用于浮点处理的寄存器&#xf…...

炉石传说HsMod插件:基于BepInEx的终极游戏体验增强工具

炉石传说HsMod插件&#xff1a;基于BepInEx的终极游戏体验增强工具 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 炉石传说HsMod是一款基于BepInEx框架开发的开源增强插件&#xff0c;为玩…...

TVA 登顶工业视觉的 “iPhone 时刻”(8)

重磅预告&#xff1a;本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容&#xff0c;该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著&#xff0c;特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...

Taotoken用量看板与成本分析功能,如何帮助团队控制大模型支出

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken用量看板与成本分析功能&#xff0c;如何帮助团队控制大模型支出 对于任何将大模型能力集成到产品开发流程中的团队而言&a…...

如何高效解决Windows游戏控制器兼容性问题:ViGEmBus的完整解决方案

如何高效解决Windows游戏控制器兼容性问题&#xff1a;ViGEmBus的完整解决方案 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否遇到过心爱的游戏控制器…...