用于提升效率的惰性序列
使用 .lazy 延迟计算,避免创建中间数组。
第 4 / 4 课12 个步骤
用于提升效率的惰性序列 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
欢迎
惰性序列会将计算推迟到需要结果时执行,因此在链式操作中可以避免创建中间数组。
急切求值的问题
```swift
let result = (1...1_000_000)
.filter { $0 % 7 == 0 } // creates array of ~142857 elements
.map { $0 * 2 } // creates another 142857-element array
.prefix(5)
// Wasteful — only 5 elements needed!
```
添加 .lazy
```swift
let result = (1...1_000_000)
.lazy
.filter { $0 % 7 == 0 }
.map { $0 * 2 }
.prefix(5)
// Only computes what prefix(5) needs — no intermediate arrays!
print(Array(result)) // [14,28,42,56,70]
```
惰性集合类型
在序列上调用 `.lazy` 时,Swift 会返回一个包装该序列的 `LazySequence`:
```swift
let lazyArr = [1,2,3].lazy // LazySequence<[Int]>
let lazyMap = lazyArr.map { $0*2 } // LazyMapSequence
```
惰性求值的适用场景
惰性求值适用于以下情况:
• 只需要大型序列的前缀
• 数据源是无限的(例如自定义生成器)
• 需要对大型集合执行多个转换的链式操作
无限序列
```swift
struct Fibonacci: Sequence {
func makeIterator() -> some IteratorProtocol {
var a = 0, b = 1
return AnyIterator { let next = a; a = b; b = next + b; return next }
}
}
let first10 = Array(Fibonacci().prefix(10))
```
使用按条件查找第一个元素的惰性处理
```swift
let firstEven = (1...Int.max)
.lazy
.first { $0 % 2 == 0 }
// Returns 2 immediately — doesn't iterate the whole range
```
强制求值
要将惰性序列具体化,请用数组进行包装:
```swift
let eager = Array((1...100).lazy.filter { $0 % 3 == 0 }.map { $0*2 })
```
惰性求值并不总是更好
对于小型集合,惰性处理会因包装类型而产生额外开销。在每条链中都应用 `.lazy` 之前,请先进行基准测试。当集合很大且需要提前终止时,再使用它。
自定义惰性生成器
```swift
func naturals() -> AnyIterator {
var n = 0
return AnyIterator { n += 1; return n }
}
Array(naturals().prefix(5)) // [1,2,3,4,5]
```
快速检查
在集合链前加上 `.lazy` 前缀有什么作用?
回顾
要点:
• `.lazy` 会将映射和筛选计算推迟到序列被消费时
• 避免分配中间数组
• 当只需要大型序列的前缀时非常有用
• 与 `prefix`、`first(where:)` 结合,实现提前终止
• 需要时使用 `Array(lazySeq)` 将序列具体化
课程完成!
免费开始
用 AI 导师学习 Swift — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 122
- 课程
- 409
常见问题解答
「用于提升效率的惰性序列」课时是免费的吗?
是的 — 「用于提升效率的惰性序列」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「用于提升效率的惰性序列」这节课中我会学到什么?
使用 .lazy 延迟计算,避免创建中间数组。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「用于提升效率的惰性序列」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。