当前位置: 首页 > 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;递减就是它的对立面。 下面是查找总结到…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)

第一篇&#xff1a;Liunx环境下搭建PaddlePaddle 3.0基础环境&#xff08;Liunx Centos8.5安装Python3.10pip3.10&#xff09; 一&#xff1a;前言二&#xff1a;安装编译依赖二&#xff1a;安装Python3.10三&#xff1a;安装PIP3.10四&#xff1a;安装Paddlepaddle基础框架4.1…...

【若依】框架项目部署笔记

参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作&#xff1a; 压缩包下载&#xff1a;http://download.redis.io/releases 1. 上传压缩包&#xff0c;并进入压缩包所在目录&#xff0c;解压到目标…...

深入理解 React 样式方案

React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...