捕获值
本课属于 Coddy Swift 学习旅程的“逻辑与流程”单元。第 40 课,共 56 课。
闭包会记住创建时处于作用域内的变量。即使外层函数已经返回,闭包主体之后仍然可以读取甚至修改这些变量。这称为捕获。
func makeCounter() -> () -> Int {
var count = 0
return {
count += 1
return count
}
}
let next = makeCounter()
print(next()) // 1
print(next()) // 2
print(next()) // 3每次调用 makeCounter 都会得到一个全新的 count,因此两个计数器永远不会共享状态:
let a = makeCounter()
let b = makeCounter()
print(a()) // 1
print(b()) // 1
print(a()) // 2捕获让闭包比普通函数更强大:它们能携带状态。你会在 JavaScript、Python 和许多其他语言中看到同样的技巧。
挑战
中等构建一个小型计数器工厂。
定义一个函数 makeCounter(start: Int, step: Int),它返回一个类型为 () -> Int 的闭包。每次调用闭包都会返回下一个值:第一次调用返回 start,下一次返回 start + step,再下一次返回 start + 2*step,以此类推。
从输入中读取三个整数:start、step 和 n。用 start 和 step 创建一个计数器,然后调用它 n 次,并将每个结果单独打印在一行上。
对于输入 5 / 3 / 4,输出为:
5
8
11
14亲手试试
let start = Int(readLine()!)!
let step = Int(readLine()!)!
let n = Int(readLine()!)!
// TODO:编写 makeCounter(start:step:) -> () -> Int,使其捕获不断更新的值
// 然后调用它 n 次,打印每次的结果
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Swift 在线编辑器