高阶函数 #
一、高阶函数概述 #
高阶函数是接受函数作为参数或返回函数的函数。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