递归约束与高阶泛型
编写 递归约束 (例如嵌套序列)和接受泛型闭包/函数的 高阶泛型 函数。
递归约束与高阶泛型 是 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 反馈 — 无需本地设置。
此课程中的所有课时
- 条件遵循协议
- 递归约束与高阶泛型
- 扩展中的 where 子句