尾随闭包
本课属于 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) { ... } 看起来就像内置循环。这正是它的作用:你自己构建的控制结构看起来和标准库中的控制结构一样。
挑战
简单定义一个函数 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) { ... },并用 "," 连接结果后输出
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Swift 在线编辑器