纯函数与无副作用设计
编写对于相同输入始终返回相同输出的函数。
纯函数与无副作用设计 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
欢迎
纯函数对于相同的输入始终产生相同的输出,并且不会产生副作用。它们是 Swift 函数式编程的基础构件。
纯函数的定义
如果一个函数满足以下条件,它就是纯函数:
• 相同的输入始终产生相同的输出
• 没有可观察的副作用(没有变更、输入输出操作或全局状态)
```swift
func add(_ a: Int, _ b: Int) -> Int { a + b } // pure
```
非纯函数示例
```swift
var total = 0
func addToTotal(_ n: Int) { total += n } // impure — mutates global
```
如果在不同的上下文中调用两次并传入 `5`,结果可能会不同。
引用透明性
纯函数调用可以替换为其结果,而不会改变程序的行为:
```swift
let result = add(2, 3) // same as writing 5
```
纯函数的优点
• 易于测试——无需设置和清理
• 可安全并行执行——没有共享状态
• 易于组合——无需担心副作用即可链接
• 可缓存——记忆化是安全的
Swift 的值类型有助于实现纯函数
由于结构体方法接收的是副本,因此它们天然倾向于保持纯函数特性:
```swift
struct Vector { var x, y: Double }
func scaled(_ v: Vector, by f: Double) -> Vector { Vector(x:v.x*f, y:v.y*f) }
```
隔离副作用
将副作用推向系统的边界:
```swift
// Pure core logic:
func processOrders(_ orders: [Order]) -> Invoice { ... }
// Impure at the edge:
func run() { let inv = processOrders(load()); save(inv) }
```
纯函数与测试
```swift
func test() {
let result = add(2, 3)
assert(result == 5) // no mocks needed!
}
```
纯函数不需要模拟对象——只需调用并断言即可。
实际示例
```swift
func discountedPrice(base: Double, discount: Double) -> Double {
base * (1 - discount)
}
let final = discountedPrice(base: 100, discount: 0.2) // 80.0
```
组合纯函数
```swift
func double(_ n: Int) -> Int { n * 2 }
func addOne(_ n: Int) -> Int { n + 1 }
let transform: (Int) -> Int = { addOne(double($0)) }
print(transform(5)) // 11
```
快速检查
哪种特性可以让函数无需模拟对象也易于测试?
回顾
要点:
• 纯函数:相同的输入 → 相同的输出,没有副作用
• 引用透明性支持替换
• 将副作用推向系统边界
• 纯函数天然易于测试和并行执行
下一步:高阶函数。
常见问题解答
「纯函数与无副作用设计」课时是免费的吗?
是的 — 「纯函数与无副作用设计」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「纯函数与无副作用设计」这节课中我会学到什么?
编写对于相同输入始终返回相同输出的函数。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「纯函数与无副作用设计」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。