泛型约束与 where 子句
应用多个约束、同类型要求和条件扩展。
泛型约束与 where 子句 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
泛型基础回顾
泛型让您能够编写灵活、可复用且适用于任何类型的代码。
func identity<T>(_ value: T) -> T { return value }
print(identity(42))
print(identity("hello"))单一类型约束
使用 T: Protocol 将泛型参数约束为遵循某个协议。
func largest<T: Comparable>(_ a: T, _ b: T) -> T {
return a > b ? a : b
}
print(largest(3, 7))使用 & 添加多个约束
通过组合多个协议,要求类型遵循其中的多个协议。
func process<T: Equatable & Hashable>(_ items: [T]) -> Set<T> {
return Set(items)
}
print(process([1,2,2,3]))函数中的 where 子句
在参数列表后添加 where 子句,可以添加更精确的约束。
func allEqual<T: Equatable>(_ array: [T]) -> Bool where T: CustomStringConvertible {
guard let first = array.first else { return true }
return array.allSatisfy { $0 == first }
}扩展中的 where
仅当类型的泛型参数满足某项要求时,才扩展该类型。
extension Array where Element: Numeric {
var sum: Element { reduce(0, +) }
}
print([1,2,3].sum)同类型要求
使用 T == U 将两个关联类型约束为相同类型。
func zip2<A: Sequence, B: Sequence>(_ a: A, _ b: B) -> [(A.Element, B.Element)]
where A.Element == B.Element {
return Swift.zip(a, b).map { ($0.0, $0.1) }
}条件遵循
当泛型类型的参数满足约束时,使该类型有条件地遵循某个协议。
extension Array: Equatable where Element: Equatable {
// stdlib already does this, shown for illustration
}
print([1,2] == [1,2])带约束的泛型类
泛型类同样可以携带约束,从而确保实例化时的类型安全。
class Box<T: Codable> {
var value: T
init(_ v: T) { self.value = v }
}
let box = Box(42)带关联类型约束的协议
在协议定义中使用 where 来约束关联类型。
protocol Container {
associatedtype Item: Equatable
var items: [Item] { get }
func contains(_ item: Item) -> Bool
}多个 where 子句
使用逗号分隔多个 where 条件,以表达复杂的要求。
func merge<C: Collection>(_ a: C, _ b: C) -> [C.Element]
where C.Element: Comparable, C.Element: Hashable {
return Array(Set(a + b)).sorted()
}泛型类型特化
Swift 会在编译时针对具体类型特化泛型函数,从而实现性能优化。
// @_specialize instructs the compiler to emit a specialized version
@_specialize(where T == Int)
func add<T: Numeric>(_ a: T, _ b: T) -> T { a + b }快速检查
如何要求泛型类型同时遵循 Comparable 和 Hashable?
课程回顾
使用 T: Protocol 添加泛型约束,通过 & 添加多个约束,使用 where 子句表达精确要求,再结合相同类型要求和条件遵循,您就能精确控制泛型代码。
常见问题解答
「泛型约束与 where 子句」课时是免费的吗?
是的 — 「泛型约束与 where 子句」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「泛型约束与 where 子句」这节课中我会学到什么?
应用多个约束、同类型要求和条件扩展。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「泛型约束与 where 子句」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 泛型约束与 where 子句
- 使用 some 关键字的不透明类型
- 使用 any 的存在类型与类型擦除
- 主要关联类型与类型化抛出