Menu
CoddyTech

返回闭包

本课属于 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:),或任何需要函数类型值的地方。

challenge icon

挑战

中等

构建两个闭包工厂:

  • greaterThan(_ k: Int) -> (Int) -> Bool:返回一个谓词,当参数严格大于 k 时结果为 true
  • scaleBy(_ k: Int) -> (Int) -> Int:返回一个将参数乘以 k 的函数

读取三行输入:

  1. 一个整数 threshold
  2. 一个整数 scale
  3. 一个由逗号分隔的整数列表,即 nums

打印三行:

  1. 大于阈值的数字(用 greaterThan 中的闭包进行筛选),并用 , 连接
  2. 同一组数字缩放后的结果(用 scaleBy 进行映射),并用 , 连接
  3. 通过筛选的数字数量

输入 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;先筛选再映射;输出拼接后的结果和数量
quiz icon自我测试

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

逻辑与流程中的所有课

自己练习: Swift 在线编辑器