Menu
CoddyTech

尾随闭包

本课属于 Coddy Swift 学习旅程的“逻辑与流程”单元。第 39 课,共 56 课。

当闭包是函数的最后一个参数时,你可以把它写在括号外面。这种写法称为尾随闭包形式,也是 Swift 代码自然的书写方式。

let nums = [1, 2, 3]
// 标准写法
let a = nums.map({ $0 * 2 })
// 尾随闭包写法
let b = nums.map { $0 * 2 }

如果闭包是唯一的参数,括号也会省略。这就是为什么你目前看到的所有内容都像是自定义控制结构。

你也可以用同样的方式编写自己的函数来接收闭包:

func repeatN(_ n: Int, action: () -> Void) {
    for _ in 0..<n {
        action()
    }
}
repeatN(3) {
    print("hi")
}

尾随闭包的写法让 repeatN(3) { ... } 看起来就像内置循环。这正是它的作用:你自己构建的控制结构看起来和标准库中的控制结构一样。

challenge icon

挑战

简单

定义一个函数 collect,它:

  • 接收一个整数 n 和一个闭包 builder: (Int) -> String
  • 对从 1 到 n(含 n)的每个 i 调用 builder,并返回生成的字符串数组

从标准输入读取一个整数,使用尾随闭包将该整数传给 collect,为每个值生成 "i=<i>",然后用 , 连接结果并打印。

输入 4 时,输出为 i=1,i=2,i=3,i=4。

亲手试试

let n = Int(readLine()!)!

// TODO: 实现函数 func collect(_ n:Int, builder:(Int)->String) -> [String]
// 然后调用 collect(n) { ... },并用 "," 连接结果后输出
quiz icon自我测试

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

逻辑与流程中的所有课

自己练习: Swift 在线编辑器