Swift开发基础08-高阶函数
高阶函数是指接受其它函数作为参数,或者返回其它函数的函数。Swift 提供了许多内置的高阶函数,这些函数在处理集合类型数据(如数组、集合等)时尤其有用。常见的高阶函数包括 map、filter、reduce、flatMap 和 compactMap。
一、常用高阶函数
1. map
map 函数会对集合中的每个元素应用一个相同的操作,并将结果聚合成一个新的集合。
示例:
假设我们有一个包含整数的数组,并希望将每个整数乘以2。
let numbers = [1, 2, 3, 4, 5]
let doubled = numbers.map { $0 * 2 }
print(doubled) // 输出: [2, 4, 6, 8, 10]
2. filter
filter 函数会对集合中的每个元素进行条件判断,并返回符合条件的元素构成的新的集合。
示例:
我们有一个数组,需要过滤出所有的偶数。
let numbers = [1, 2, 3, 4, 5]
let evens = numbers.filter { $0 % 2 == 0 }
print(evens) // 输出: [2, 4]
3. reduce
reduce 函数会将集合中的元素组合成一个值,通过应用一个累计的操作。它需要一个初始值和一个合并操作。
示例:
我们有一个数组,需要计算所有元素的总和。
let numbers = [1, 2, 3, 4, 5]
let sum = numbers.reduce(0) { $0 + $1 }
print(sum) // 输出: 15
使用闭包语法可以简洁一点:
let sum = numbers.reduce(0, +)
print(sum) // 输出: 15
4. flatMap
flatMap 会对多维集合进行扁平化操作,并将子集合中每一个元素应用特定的操作,然后返回一个新的集合。
示例:
我们有一个由数组组成的数组,需要将其展平成一个单一的数组。
let arrayOfArrays = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
let flattened = arrayOfArrays.flatMap { $0 }
print(flattened) // 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
5. compactMap
compactMap 与 map 相似,但它会移除所有结果中的 nil 值。通常用于处理返回 Optional 的操作。
示例:
我们有一个字符串数组,希望将其转换为整数,但其中有些值无法转换。
let strings = ["1", "2", "three", "4", "five"]
let numbers = strings.compactMap { Int($0) }
print(numbers) // 输出: [1, 2, 4]
6. 自定义高阶函数
除了 Swift 提供的这些高阶函数,你也可以根据需要定义自己的高阶函数。
示例:
我们定义一个高阶函数,该函数接受一个过滤条件并返回符合条件的数组:
func customFilter<T>(array: [T], condition: (T) -> Bool) -> [T] {
var result = [T]()
for element in array {
if condition(element) {
result.append(element)
}
}
return result
}
let numbers = [1, 2, 3, 4, 5]
let evens = customFilter(array: numbers) { $0 % 2 == 0 }
print(evens) // 输出: [2, 4]
二、其他高阶函数
除了已经介绍的 map、filter、reduce、flatMap 和 compactMap 之外,Swift 还提供了其他一些内置的高阶函数。
1. forEach
forEach 函数会对集合中的每一个元素执行指定的操作,但不会返回结果。它通常用作遍历集合的一个简洁替代。
示例:
let numbers = [1, 2, 3, 4, 5]
numbers.forEach { number in
print(number)
}
2. sorted 和 sort
sorted 函数会返回一个排序后的新数组,而 sort 方法则会原地排序数组。
示例:
let numbers = [5, 3, 1, 4, 2]
let sortedNumbers = numbers.sorted()
print(sortedNumbers) // 输出: [1, 2, 3, 4, 5]
使用自定义排序规则:
let sortedDescending = numbers.sorted { $0 > $1 }
print(sortedDescending) // 输出: [5, 4, 3, 2, 1]
原地排序:
var numbers = [5, 3, 1, 4, 2]
numbers.sort()
print(numbers) // 输出: [1, 2, 3, 4, 5]
3. contains
contains 函数用于检查集合中是否包含某个元素。
示例:
let numbers = [1, 2, 3, 4, 5]
let containsThree = numbers.contains(3)
print(containsThree) // 输出: true
或者使用自定义条件:
let hasEvenNumber = numbers.contains { $0 % 2 == 0 }
print(hasEvenNumber) // 输出: true
4. first(where:) 和 last(where:)
first(where:) 函数会返回满足条件的第一个元素,last(where:) 会返回满足条件的最后一个元素。
示例:
let numbers = [1, 2, 3, 4, 5]
if let firstEven = numbers.first(where: { $0 % 2 == 0 }) {
print(firstEven) // 输出: 2
}
if let lastEven = numbers.last(where: { $0 % 2 == 0 }) {
print(lastEven) // 输出: 4
}
5. allSatisfy
allSatisfy 函数会检查集合中的所有元素是否都满足指定的条件。
示例:
let numbers = [2, 4, 6, 8, 10]
let allEven = numbers.allSatisfy { $0 % 2 == 0 }
print(allEven) // 输出: true
6. dropFirst 和 dropLast
dropFirst 函数会移除集合的第一个元素,dropLast 函数则会移除集合的最后一个元素。
示例:
let numbers = [1, 2, 3, 4, 5]
let withoutFirst = numbers.dropFirst()
print(withoutFirst) // 输出: [2, 3, 4, 5]
let withoutLast = numbers.dropLast()
print(withoutLast) // 输出: [1, 2, 3, 4]
7. prefix 和 suffix
prefix 函数会返回集合的前几个元素,suffix 函数会返回集合的最后几个元素。
示例:
let numbers = [1, 2, 3, 4, 5]
let firstThree = numbers.prefix(3)
print(firstThree) // 输出: [1, 2, 3]
let lastTwo = numbers.suffix(2)
print(lastTwo) // 输出: [4, 5]
8. zip
zip 函数会合并两个集合,依次创建对应的元素对,形成一个新的序列。
示例:
let names = ["Alice", "Bob", "Charlie"]
let ages = [25, 30, 35]
let combined = zip(names, ages)
for (name, age) in combined {
print("\(name) is \(age) years old")
}
// 输出:
// Alice is 25 years old
// Bob is 30 years old
// Charlie is 35 years old
9. reduce(into:)
reduce(into:) 可以用来将集合的元素聚合成一个新集合,避免像 reduce 那样频繁地创建新值,从而提高性能。
示例:
let numbers = [1, 2, 3, 4, 5]
let doubled = numbers.reduce(into: [Int]()) { result, number in
result.append(number * 2)
}
print(doubled) // 输出: [2, 4, 6, 8, 10]
总结
Swift 提供了丰富的内置高阶函数,这些函数极大地简化了对集合数据的处理,使代码更加简洁和功能性更强。通过灵活运用这些高阶函数,可以减少代码中的循环和条件判断,使代码更具可读性和维护性。了解并掌握这些高阶函数,可以帮助你编写更加简洁、高效和优雅的 Swift 代码。
Swift开发基础08-高阶函数的更多相关文章
- Python 编程基础之高阶函数篇(一)
高阶函数:能接受函数作为参数的函数. 如: f=abs def add(x,y,f): return f(x)+f(y) 如果我们用:add(-5,9,f)来调用该高阶函数,则返回结果为:14 ...
- Python基础——4高阶函数
高阶函数 函数本身可用变量指向,把变量当做函数参数的函数成为高阶函数 map and reduce map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每 ...
- Python基础灬高阶函数(lambda,filter,map,reduce,zip)
高阶函数 lambda函数 关键字lambda表示匿名函数,当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. lambda函数省略函数名,冒号前为参数,冒号后函数体. # ...
- python开发基础04-函数、递归、匿名函数、高阶函数、装饰器
匿名函数 lamba lambda x,y,z=1:x+y+z 匿名就是没有名字 def func(x,y,z=1): return x+y+z 匿名 lambda x,y,z=1:x+y+z #与函 ...
- day11-Python运维开发基础(迭代器与可迭代对象、高阶函数)
1. 迭代器与可迭代对象 # ### 迭代器 """ 迭代器: 能被next方法调用,并且不断返回下一个值的对象,是迭代器(对象) 特征:迭代器会生成惰性序列,它通过计算 ...
- Swift 烧脑体操(三) - 高阶函数
前言 Swift 其实比 Objective-C 复杂很多,相对于出生于上世纪 80 年代的 Objective-C 来说,Swift 融入了大量新特性.这也使得我们学习掌握这门语言变得相对来说更加困 ...
- Swift 中的高阶函数和函数嵌套
高阶函数 在Swift中,函数可做为“一等公民”的存在,也就意味着,我们可以和使用 int 以及 String 一样,将函数当做 参数.值.类型来使用. 其中,将函数当作一个参数和值来使用可见下: t ...
- swift 的高阶函数的使用代码
//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...
- python基础——高阶函数
python基础——高阶函数 高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 以Python内置的求绝对值的函数a ...
- JavaScript设计模式与开发实践——读书笔记1.高阶函数(下)
上部分主要介绍高阶函数的常见形式,本部分将着重介绍高阶函数的高级应用. 1.currying currying指的是函数柯里化,又称部分求值.一个currying的函数会先接受一些参数,但不立即求值, ...
随机推荐
- PHP做api开发时,签名验证你是怎么设计的
开发过程中,我们经常会与接口打交道,有的时候是调取别人网站的接口,有的时候是为他人提供自己网站的接口,但是在这调取的过程中都离不开签名验证. 我们在设计签名验证的时候,请注意要满足以下几点: 可变性: ...
- HTML——input之单行文本框
在 HTML 中,把 <input> 标签的 type 属性设置为 text 可以表示单行文本框,又叫做常规文本框.具体语法格式如下: <input type="text& ...
- Qt一键部署配置(Qt程序打包)
Qt一键部署配置(Qt程序打包) 1.版本 系统版本:windows10 Qt版本:5.15.2 2.设置可执行程序输出路径 打开.pro文件,输入DESTDIR = $$PWD/../bin,这 ...
- 8.21考试总结(NOIP模拟45)[打表·蛇·购物·ants]
有型的东西终究会消逝,不过--终于,这份回忆还是永远不朽的- 前言 这次考试暴露出来了不少问题. 比如答题策略策略不当导致 T2 的 65pts 暴力根本没有打. 知识遗忘太快不牢固,T4 是之前的一 ...
- 微软官方开源免费的Blazor UI组件库 - Fluent UI Blazor
前言 今天大姚给大家分享一个由微软官方开源(MIT License).免费的Blazor UI组件库:Fluent UI Blazor. 全面的ASP.NET Core Blazor简介和快速入门 F ...
- .NET C# 程序自动更新组件
引言 本来博主想偷懒使用AutoUpdater.NET组件,但由于博主项目有些特殊性和它的功能过于多,于是博主自己实现一个轻量级独立自动更新组件,可稍作修改集成到大家自己项目中,比如:WPF/Winf ...
- 终于搞懂了!原来vue3中template使用ref无需.value是因为这个
前言 众所周知,vue3的template中使用ref变量无需使用.value.还可以在事件处理器中进行赋值操作时,无需使用.value就可以直接修改ref变量的值,比如:<button @cl ...
- css制作骰子
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- 小程序视图组件 scroll-view
视图容器组件 3.2.1.swiper 滑块视图容器. https://developers.weixin.qq.com/miniprogram/dev/component/swiper.html 3 ...
- CSPJ赛前刷题
T1 \(\color{red}\text{正难则反}\),最短路 T2 图论(糅杂着一点DP) T3 DP 优化:减去不需要的状态 T4 一定要写注释!!! 不开longlong见祖宗!!! T5 ...