Swift高阶函数大全:让你的代码更优雅高效

1,244 阅读2分钟

大家好!今天我们来深入探讨Swift中那些让集合操作变得轻松愉快的高阶函数。这些函数就像是数据处理流水线上的各种工具,每个都有其独特的用途和魅力。

基础三剑客

1. map:变形大师

let prices = [100, 200, 300]
let discountedPrices = prices.map { $0 * 0.8 }
// [80.0, 160.0, 240.0]

map就像一位魔术师,能把数组中的每个元素变成你想要的样子。它总是返回一个与原数组等长的新数组。

2. filter:挑剔的门卫

let inventory = ["iPhone": 10, "MacBook": 5, "AirPods": 20]
let lowStock = inventory.filter { $0.value < 15 }
// ["iPhone": 10, "MacBook": 5]

filter只放行符合条件的元素,是数据筛选的利器。

3. reduce:数据聚合器

let sales = [450, 320, 680]
let totalSales = sales.reduce(1000) { $0 + $1 } 
// 2450(初始值1000加上所有销售额)

reduce可以把集合"浓缩"成一个值,特别适合做求和、求积等聚合操作。

进阶高手

4. forEach:简洁的遍历

["苹果", "香蕉", "橙子"].forEach { fruit in
    print("今天特价:(fruit)")
}

forEach比传统for循环更简洁,但要注意:

  • 不能使用break/continue
  • 用return只能跳出当前闭包

5. sorted:排序专家

let students = [
    (name: "张三", score: 88),
    (name: "李四", score: 92),
    (name: "王五", score: 85)
]

let ranked = students.sorted { $0.score > $1.score }
// 按分数降序排列

6. contains(where:):存在性检查

let emails = ["a@test.com", "b@gmail.com", "c@qq.com"]
let hasGmail = emails.contains { $0.contains("@gmail.com") }
// true

比先filter再判断isEmpty更高效!

查找高手

7. first(where:) / last(where:)

let transactions = [100, -50, 200, -30, 150]
let firstLargeDeposit = transactions.first { $0 > 150 } // 200
let lastWithdrawal = transactions.last { $0 < 0 }       // -30

找到第一个/最后一个符合条件的元素,比filter(...).first更高效。

集合切片

8. prefix( :) 和 dropFirst( :)

let historyData = [23, 45, 67, 89, 12, 34, 56]

let recent5 = historyData.prefix(5)    // 前5个元素
let withoutFirst2 = historyData.dropFirst(2) // 去掉前2个后的元素

这些方法在处理大数据分页或滑动窗口时特别有用。

逻辑判断

9. allSatisfy(_:):全员检测

let examScores = [85, 90, 88, 92]
let allPassed = examScores.allSatisfy { $0 >= 60 } // true

检查集合中所有元素是否都满足条件,比手动遍历更优雅。

性能优化

10. lazy:延迟加载

let hugeRange = 1...1000000
let result = hugeRange.lazy
    .filter { $0 % 3 == 0 }
    .map { $0 * 2 }
    .prefix(10)

lazy会延迟计算,直到真正需要结果时才执行操作,避免创建大量中间数组。

实战组合技

let salesData = [
    (region: "North", amount: 3500),
    (region: "South", amount: 4200),
    (region: "East", amount: 3800),
    (region: "West", amount: 5100)
]

// 找出金额超过4000的地区,按金额降序排列,取前2名
let topPerformers = salesData
    .filter { $0.amount > 4000 }
    .sorted { $0.amount > $1.amount }
    .prefix(2)
    .map { $0.region }

// ["West", "South"]

使用建议

  1. 优先考虑可读性:在业务代码中大胆使用高阶函数
  2. 性能敏感处权衡:对于超大数据集,考虑使用lazy或传统循环
  3. 避免过度嵌套:如果闭包太复杂,考虑提取为独立函数
  4. 善用类型推断:简明闭包可以用0、0、1等缩写

总结对比

函数特点典型用途
map一对一转换数据类型转换、计算衍生值
filter条件筛选数据过滤、搜索
reduce聚合计算求和、求积、拼接字符串
forEach简洁遍历替代简单for循环
sorted排序各种排序需求
contains存在性检查快速判断条件是否满足
first/last查找元素替代filter(...).first
prefix/drop切片操作分页、窗口计算
allSatisfy全员检测数据验证
lazy延迟计算大数据处理优化

记住:没有最好的函数,只有最适合场景的选择。希望这些高阶函数能成为你Swift开发中的得力助手!如果有任何使用心得,欢迎在评论区分享~