用 Swift 的高阶函数 reduce 提升代码可读性

前言

如果我们不了解 Swift 中高阶函数 reduce 的使用,在处理数组元素累加的时候,可能会用 for 循环去实现,比如下面的代码:

ini 复制代码
let arr = [1, 2, 3, 4]
var result = 0
for element in arr {
    result += element
}

上述代码存在两个问题:

  • result 虽然后续不会修改它的值,但也需要将其用 var 来修饰。这违反了 Swift 尽量使用常量(let)保护数据一致性的原则。
  • 代码可读性较低。

我们可以使用 reduce 来避免上面的两个问题。首先,我们来看下 reduce 的作用及使用方式。

reduce

Swiftreduce 函数可以实现通过一组数据来生成单个值。你可以使用它将数组转换为字典,或者另一个常见的场景是将数组中的元素累加。

reduce 是一种典型的函数模式,它是一种高阶函数,它将一个集合清晰而富有表现力地组合成一个值。它的复杂度是O(n ),其中 n 是集合的长度。

介绍完它的作用,下面我们来看下它的使用方式。

reduce 的核心有两个参数:

  • 初始值
  • 指定如何将每个元素与累积结果组合在一起的闭包

现在,我们通过 reduce 函数重构一下上面的 for 循环代码:

ini 复制代码
let arr = [1, 2, 3, 4]
let result = arr.reduce(0) { partialResult, element in
    partialResult + element
}

在我们这个例子中,reduce(0) 中的 0 是初始值,闭包获取运行总数(结果),并将数组中的每个数字相加。最初,结果为0,但随着元素的增加,结果会相应增加。最终的计算结果为 10。

当然,上面的写法是完整写法,我们也可以将其简化为下面的代码:

ini 复制代码
let result = arr.reduce(0, +)

上面的写法成立是因为 + 是一个函数,它接受两个数字并返回它们的和。简写的方式可以使代码更加简洁。

reduce 的更多用法

我们除了可以用 reduce 实现累加功能,还可以用它来将二维数组转为一维数组。比如下面的示例代码:

scss 复制代码
let target = [[1, 2], [3, 4], [5]]
let result = target.reduce([], +)
print(result) // [1, 2, 3, 4, 5]

+ 操作符将嵌套数组的每个元素添加到结果数组中,这是一种将所有元素合并为一个数组的简洁方式。当然,铺平数组我们也可以用另一个高阶函数 - flatMap 来实现,示例代码如下:

ini 复制代码
let result = target.flatMap { $0 }

另一个使用场景是:统计数组中每个元素出现的次数并将结果生成一个字典。示例代码如下:

css 复制代码
let fruits = ["苹果", "水蜜桃", "水蜜桃", "水蜜桃", "梨"]
let result = fruits.reduce(into: [:]) { partialResult, fruit in
    partialResult[fruit, default: 0] += 1
}
print(result) // ["梨": 1, "苹果": 1, "水蜜桃": 3]

总结

reduce 是 Swift 中的高阶函数,它的作用是将数组中的元素通过运算符得到一个总值。可以提高代码的可读性。

相关推荐
大熊猫侯佩3 小时前
Swift 6.4 的 Ref / MutableRef 大揭秘:给值类型开一扇“安全的小窗”
ios·swift·编程语言
大熊猫侯佩19 小时前
WWDC26 SwiftUI 进化之路:砸碎黑盒,彻底迎来开发自由!
ios·swiftui·swift
光影少年19 小时前
懒加载与分包:React.lazy + Suspense
前端·react.js·掘金·金石计划
游戏开发爱好者820 小时前
iPhone真机调试有哪些方法?一次定位推送权限问题时整理出来的几种方案
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
大熊猫侯佩1 天前
WWDC26 最被忽视的王炸:告别“伪并发”陷阱,Swift 6.4 的 async defer
ios·swift·编程语言
光影少年3 天前
js单线程,为什在node环境下的js可以处理高并发请求?
前端·javascript·掘金·金石计划
人月神话-Lee3 天前
WWDC26 深度解析:如何在 iOS 27 中打造“秒开”的相机体验
ios·swift·相机·wwdc·用户体验
Tr2e4 天前
🐱 从 0 到 1:用 Swift 手搓一个 macOS 桌面宠物(附源码)
macos·ios·swift
光影少年4 天前
组件复用:HOC、Render Props、自定义Hook 对比
前端·react.js·掘金·金石计划
人月神话-Lee4 天前
【WWDC】Core AI:iOS 端侧大模型新纪元
人工智能·ios·ai·swift·wwdc·core ai