Swift Academy · 课时

递归约束与高阶泛型

编写 递归约束 (例如嵌套序列)和接受泛型闭包/函数的 高阶泛型 函数。

第 2 / 3 课8 个步骤

递归约束与高阶泛型 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 2 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 3 节课。

是什么以及为什么

本课将介绍:

  • 递归约束:对嵌套泛型成员施加的约束(例如,序列的序列)。
  • 高阶泛型:接受泛型闭包或函数的泛型函数。

嵌套序列(flatten)

这是一个经典的递归约束:我们要求 C.Element: Sequence,这样就可以深入迭代两层。

// Works for any Collection whose elements are Sequences
func flatten<C: Collection>(_ c: C) -> [C.Element.Element]
where C.Element: Sequence {
    var result: [C.Element.Element] = []
    result.reserveCapacity(c.reduce(0) { $0 + ($1 as AnySequence<C.Element.Element>).underestimatedCount })
    for inner in c {
        for e in inner { result.append(e) }
    }
    return result
}
let nested = [[1,2], [3], [4,5]]
print(flatten(nested))  // [1,2,3,4,5]

泛型映射 nested 结构

我们施加两层约束:C: Collection 和 C.Element: Collection,从而可以在每一层调用 map。

// Map over a two-level structure without fixing concrete types
func mapNested<C: Collection, R>(_ c: C, _ transform: (C.Element.Element) -> R) -> [[R]]
where C.Element: Collection {
    return c.map { inner in inner.map(transform) }
}
let doubled = mapNested([[1,2],[3]], { $0 * 2 })
print(doubled) // [[2,4],[6]]

compose(f,g)

高阶泛型:该函数以函数本身作为泛型对象,从而构建类似 compose 的可复用流水线。

// Compose two generic transforms that work on the same element type
func compose<A, B, C>(
    _ f: @escaping (B) -> C,
    _ g: @escaping (A) -> B
) -> (A) -> C {
    { a in f(g(a)) }
}
let toString: (Int) -> String = { "\\($0)" }
let length: (String) -> Int = { $0.count }
let intToLen = compose(length, toString)
print(intToLen(1234))  // 4

泛型闭包参数

闭包 f 也是一个泛型参数。我们通过 where 约束保持类型的灵活性。

// A generic "transform each" that accepts ANY transform (generic in T/U)
func transformEach<T, U, C: Collection>(_ c: C, using f: (T) -> U) -> [U]
where C.Element == T {
    var out: [U] = []
    out.reserveCapacity(c.count)
    for x in c { out.append(f(x)) }
    return out
}
let words = ["swift","kit"]
print(transformEach(words, using: { $0.uppercased() })) // ["SWIFT","KIT"]

指南

建议:

  • 只编写所需的最小约束(Sequence 而不是 Collection)。
  • 为提升可读性,优先使用where 子句。
  • 使用多个具体类型进行测试,以确保通用性。
  • 记录假设(例如元素顺序和唯一性)。

高阶泛型的定义

快速检查:是什么让一个函数成为高阶泛型函数?

回顾

回顾:使用递归约束(例如 C.Element: Sequence)处理嵌套泛型;使用高阶泛型来清晰地组合可复用的函数流水线。

免费开始

用 AI 导师学习 Swift — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
122
课程
409

常见问题解答

「递归约束与高阶泛型」课时是免费的吗?

是的 — 「递归约束与高阶泛型」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 3 节课。

「递归约束与高阶泛型」这节课中我会学到什么?

编写 递归约束 (例如嵌套序列)和接受泛型闭包/函数的 高阶泛型 函数。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 3 节。

「递归约束与高阶泛型」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 条件遵循协议
  2. 递归约束与高阶泛型
  3. 扩展中的 where 子句
← 返回 Swift Academy