高阶函数 #

一、高阶函数概述 #

高阶函数是接受函数作为参数或返回函数的函数。Swift提供了多种强大的高阶函数来处理集合。

1.1 常用高阶函数 #

  • map - 转换每个元素
  • filter - 过滤元素
  • reduce - 归约元素
  • flatMap - 扁平化并转换
  • compactMap - 去除nil并转换

二、map #

2.1 基本用法 #

swift
let numbers = [1, 2, 3, 4, 5]

let doubled = numbers.map { $0 * 2 }
print(doubled)

let squared = numbers.map { $0 * $0 }
print(squared)

2.2 类型转换 #

swift
let numbers = [1, 2, 3, 4, 5]

let strings = numbers.map { String($0) }
print(strings)

let doubles = numbers.map { Double($0) }
print(doubles)

2.3 对象转换 #

swift
struct User {
    let id: Int
    let name: String
}

let users = [
    User(id: 1, name: "张三"),
    User(id: 2, name: "李四"),
    User(id: 3, name: "王五")
]

let names = users.map { $0.name }
print(names)

let ids = users.map { $0.id }
print(ids)

2.4 字典map #

swift
let scores = ["张三": 90, "李四": 85, "王五": 95]

let descriptions = scores.map { "\($0.key): \($0.value)分" }
print(descriptions)

let names = scores.map { $0.key }
print(names)

三、filter #

3.1 基本用法 #

swift
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

let evenNumbers = numbers.filter { $0 % 2 == 0 }
print(evenNumbers)

let greaterThanFive = numbers.filter { $0 > 5 }
print(greaterThanFive)

3.2 过滤对象 #

swift
struct Product {
    let name: String
    let price: Double
    let inStock: Bool
}

let products = [
    Product(name: "iPhone", price: 999, inStock: true),
    Product(name: "MacBook", price: 1999, inStock: false),
    Product(name: "iPad", price: 599, inStock: true)
]

let availableProducts = products.filter { $0.inStock }
print(availableProducts.map { $0.name })

let expensiveProducts = products.filter { $0.price > 1000 }
print(expensiveProducts.map { $0.name })

3.3 多条件过滤 #

swift
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

let result = numbers.filter { $0 > 3 && $0 < 8 }
print(result)

3.4 字典过滤 #

swift
let scores = ["张三": 90, "李四": 55, "王五": 95, "赵六": 45]

let passed = scores.filter { $0.value >= 60 }
print(passed)

四、reduce #

4.1 基本用法 #

swift
let numbers = [1, 2, 3, 4, 5]

let sum = numbers.reduce(0, +)
print(sum)

let product = numbers.reduce(1, *)
print(product)

4.2 自定义归约 #

swift
let numbers = [1, 2, 3, 4, 5]

let sum = numbers.reduce(0) { result, number in
    return result + number
}
print(sum)

let concatenated = numbers.reduce("") { result, number in
    return result + "\(number)"
}
print(concatenated)

4.3 查找最大最小值 #

swift
let numbers = [3, 1, 4, 1, 5, 9, 2, 6]

let max = numbers.reduce(Int.min) { $0 > $1 ? $0 : $1 }
print(max)

let min = numbers.reduce(Int.max) { $0 < $1 ? $0 : $1 }
print(min)

4.4 构建字典 #

swift
let names = ["张三", "李四", "王五"]

let nameLengths = names.reduce(into: [String: Int]()) { result, name in
    result[name] = name.count
}
print(nameLengths)

五、flatMap #

5.1 扁平化二维数组 #

swift
let nested = [[1, 2], [3, 4], [5, 6]]

let flattened = nested.flatMap { $0 }
print(flattened)

5.2 链式操作 #

swift
let nested = [[1, 2], [3, 4], [5, 6]]

let result = nested.flatMap { $0 }.map { $0 * 2 }
print(result)

5.3 可选值处理 #

swift
let strings = ["1", "2", "three", "4", "five"]

let numbers = strings.flatMap { Int($0) }
print(numbers)

六、compactMap #

6.1 去除nil #

swift
let numbers: [Int?] = [1, nil, 3, nil, 5]

let nonNil = numbers.compactMap { $0 }
print(nonNil)

6.2 转换并去nil #

swift
let strings = ["1", "2", "three", "4", "five"]

let numbers = strings.compactMap { Int($0) }
print(numbers)

6.3 对象转换 #

swift
struct User {
    let id: Int
    let name: String?
}

let users = [
    User(id: 1, name: "张三"),
    User(id: 2, name: nil),
    User(id: 3, name: "王五")
]

let names = users.compactMap { $0.name }
print(names)

七、组合使用 #

7.1 map + filter #

swift
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

let result = numbers
    .filter { $0 % 2 == 0 }
    .map { $0 * $0 }
print(result)

7.2 map + filter + reduce #

swift
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

let sumOfEvenSquares = numbers
    .filter { $0 % 2 == 0 }
    .map { $0 * $0 }
    .reduce(0, +)
print(sumOfEvenSquares)

7.3 复杂数据处理 #

swift
struct Student {
    let name: String
    let scores: [Int]
}

let students = [
    Student(name: "张三", scores: [90, 85, 88]),
    Student(name: "李四", scores: [75, 80, 82]),
    Student(name: "王五", scores: [95, 92, 98])
]

let averageScores = students.map { student in
    let sum = student.scores.reduce(0, +)
    return (name: student.name, average: Double(sum) / Double(student.scores.count))
}

print(averageScores)

let topStudents = averageScores
    .filter { $0.average >= 90 }
    .map { $0.name }
print(topStudents)

八、其他高阶函数 #

8.1 forEach #

swift
let numbers = [1, 2, 3, 4, 5]

numbers.forEach { print($0) }

8.2 first(where:) #

swift
let numbers = [1, 2, 3, 4, 5]

let firstEven = numbers.first { $0 % 2 == 0 }
print(firstEven ?? 0)

8.3 contains(where:) #

swift
let numbers = [1, 2, 3, 4, 5]

let hasEven = numbers.contains { $0 % 2 == 0 }
print(hasEven)

8.4 allSatisfy #

swift
let numbers = [2, 4, 6, 8, 10]

let allEven = numbers.allSatisfy { $0 % 2 == 0 }
print(allEven)

8.5 partition #

swift
var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

let pivot = numbers.partition { $0 % 2 == 0 }
print(numbers)
print("偶数: \(numbers[0..<pivot])")
print("奇数: \(numbers[pivot...])")

8.6 sorted #

swift
let numbers = [3, 1, 4, 1, 5, 9, 2, 6]

let ascending = numbers.sorted { $0 < $1 }
print(ascending)

let descending = numbers.sorted { $0 > $1 }
print(descending)

九、性能优化 #

9.1 避免多次遍历 #

swift
let numbers = [1, 2, 3, 4, 5]

let result = numbers.reduce(into: (sum: 0, count: 0)) { result, number in
    result.sum += number
    result.count += 1
}
print("Sum: \(result.sum), Count: \(result.count)")

9.2 惰性求值 #

swift
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

let result = numbers.lazy
    .filter { $0 % 2 == 0 }
    .map { $0 * 2 }
    .prefix(3)

print(Array(result))

十、总结 #

本章学习了Swift高阶函数:

  • map - 转换每个元素
  • filter - 过滤元素
  • reduce - 归约元素
  • flatMap - 扁平化并转换
  • compactMap - 去除nil并转换

最佳实践:

  • 链式调用提高可读性
  • 使用lazy延迟计算
  • 选择合适的高阶函数
  • 避免不必要的遍历

下一章,我们将学习面向对象编程!

最后更新:2026-03-26