返回闭包
本课属于 Coddy Swift 学习旅程的“逻辑与流程”单元。第 41 课,共 56 课。
你看到 makeCounter 返回了一个闭包。用同样的技巧,你可以构建可配置的行为:只接收一次参数,就能得到一个可以多次使用这些参数的函数。
func multiplier(_ k: Int) -> (Int) -> Int {
return { n in n * k }
}
let triple = multiplier(3)
let tenfold = multiplier(10)
print(triple(4)) // 12
print(tenfold(4)) // 40返回的闭包会捕获 k,因此每次调用 multiplier(...) 都会生成一个全新的闭包,并拥有自己的 k。
这种模式是 Swift 中“策略”代码的核心:编写一个接收配置并返回闭包的函数,然后将闭包传递给 map、filter、sorted(by:),或任何需要函数类型值的地方。
挑战
中等构建两个闭包工厂:
greaterThan(_ k: Int) -> (Int) -> Bool:返回一个谓词,当参数严格大于k时结果为truescaleBy(_ k: Int) -> (Int) -> Int:返回一个将参数乘以k的函数
读取三行输入:
- 一个整数
threshold - 一个整数
scale - 一个由逗号分隔的整数列表,即
nums
打印三行:
- 大于阈值的数字(用
greaterThan中的闭包进行筛选),并用,连接 - 同一组数字缩放后的结果(用
scaleBy进行映射),并用,连接 - 通过筛选的数字数量
输入 5 / 3 / 2,7,3,8,9 时,输出为:
7,8,9
21,24,27
3亲手试试
let threshold = Int(readLine()!)!
let scale = Int(readLine()!)!
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
// TODO:实现 greaterThan 和 scaleBy;先筛选再映射;输出拼接后的结果和数量
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Swift 在线编辑器