Swift 函数式编程简介
Swift 是一种多范式编程语言,由 Apple 开发,用于创建 iOS、macOS、watchOS 和 tvOS 应用程序。除了面向对象和面向协议的方法之外,Swift 还积极支持 函数式编程。这种风格基于使用纯函数、数据不可变性和避免副作用。
函数式编程使代码更可预测、更易测试且并行安全。在本文中,我们将探讨 Swift 中函数式方法的关键概念:不可变性、高阶函数、闭包和方法链。您将看到如何使用 map、filter 和 reduce 编写简洁且富有表现力的代码。
Swift 中函数式方法的基础
不可变性
在函数式编程中,数据在创建后不会被修改。与其修改现有对象,不如创建一个新对象。Swift 通过使用关键字 let 声明常量来鼓励这种方法。
// 不可变值let numbers = [1, 2, 3, 4, 5]// numbers.append(6) // 编译错误 — numbers 是不可变的
// 创建新数组let newNumbers = numbers + [6]print(newNumbers) // [1, 2, 3, 4, 5, 6]使用 let 而不是 var 有助于避免意外的状态更改并简化调试。
函数作为一等公民
在 Swift 中,函数是一等公民。它们可以赋值给变量、作为参数传递以及从其他函数返回。
// 赋值给变量的函数let multiply: (Int, Int) -> Int = { $0 * $1 }print(multiply(3, 4)) // 12
// 接受另一个函数的函数func applyOperation(_ a: Int, _ b: Int, operation: (Int, Int) -> Int) -> Int { return operation(a, b)}
let result = applyOperation(10, 5, operation: multiply)print(result) // 50Swift 中的闭包
闭包是自包含的功能块,可以捕获并存储对其周围上下文中变量的引用。在 Swift 中,闭包广泛用于回调和函数式转换。
// 简单闭包let greeting = { (name: String) -> String in return "你好,\\(name)!"}print(greeting("世界")) // 你好,世界!
// 带参数的简写形式let numbers = [3, 1, 4, 1, 5, 9]let sorted = numbers.sorted { $0 < $1 }print(sorted) // [1, 1, 3, 4, 5, 9]闭包使代码紧凑且富有表现力,尤其是在处理集合时。
高阶函数:map、filter、reduce
这是 Swift 中函数式编程的三大支柱。它们允许处理数组、字典和其他集合,而无需显式循环。
map — 转换每个元素
map 方法将闭包应用于集合的每个元素,并返回一个包含结果的新数组。
let prices = [100, 200, 300, 400]let discounted = prices.map { $0 * 0.9 }print(discounted) // [90.0, 180.0, 270.0, 360.0]
// 处理字符串let names = ["安娜", "鲍里斯", "维克多"]let uppercased = names.map { $0.uppercased() }print(uppercased) // ["安娜", "鲍里斯", "维克多"]filter — 按条件筛选
filter 返回一个新数组,仅包含满足给定条件的元素。
let scores = [45, 78, 92, 33, 88, 61]let passingScores = scores.filter { $0 >= 60 }print(passingScores) // [78, 92, 88, 61]
// 字符串筛选let words = ["Swift", "iOS", "macOS", "函数"]let shortWords = words.filter { $0.count <= 4 }print(shortWords) // ["iOS", "macOS"]