Menu
CoddyTech

捕获值

本课属于 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 和许多其他语言中看到同样的技巧。

challenge icon

挑战

中等

构建一个小型计数器工厂。

定义一个函数 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 次,打印每次的结果
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Swift 在线编辑器