Swift中的函数式编程:基础与示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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) // 50


Swift 中的闭包



闭包是自包含的功能块,可以捕获并存储对其周围上下文中变量的引用。在 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"]

博客

书籍推荐