条件一致性
使用 where 子句让泛型类型有条件地遵循协议。
条件一致性 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
欢迎
条件遵循可以让泛型类型仅在其类型参数满足特定约束时遵循某个协议。这是 Swift 类型系统表达能力的基石。
基本条件遵循
```swift
extension Array: Equatable where Element: Equatable {
// Array is Equatable only when Element is Equatable
}
let a = [1,2,3]
let b = [1,2,3]
print(a == b) // true — works because Int is Equatable
```
自定义泛型类型
```swift
struct Box { var value: T }
extension Box: Equatable where T: Equatable {
static func == (lhs: Box, rhs: Box) -> Bool {
lhs.value == rhs.value
}
}
print(Box(value: 42) == Box(value: 42)) // true
```
条件 Hashable 遵循
```swift
extension Box: Hashable where T: Hashable {
func hash(into hasher: inout Hasher) {
hasher.combine(value)
}
}
// Box is Hashable; Box is not
```
条件 Codable 遵循
```swift
extension Box: Codable where T: Codable {}
let box = Box(value: "hello")
let data = try JSONEncoder().encode(box) // works — String is Codable
```
扩展中的 where 子句
```swift
extension Collection where Element == Int {
var sum: Int { reduce(0, +) }
}
print([1,2,3,4].sum) // 10
// This extension only applies to collections of Int
```
多重约束
```swift
extension Dictionary where Key: Comparable, Value: Equatable {
func sortedByKey() -> [(Key, Value)] {
sorted { $0.key < $1.key }
}
}
```
协议条件遵循
```swift
protocol Printable { func prettyPrint() }
extension Optional: Printable where Wrapped: Printable {
func prettyPrint() {
switch self {
case .none: print("nil")
case .some(let v): v.prettyPrint()
}
}
}
```
使用条件遵循
```swift
let opt: Int? = 42
// If Int conformed to Printable:
// opt.prettyPrint() // "42"
// Standard usage:
let nums = Optional([1,2,3]) // [1,2,3]?
if let arr = nums, arr == [1,2,3] { ... } // Equatable via conditional
```
追溯性遵循警告
Swift 5.7+ 会针对追溯性遵循(为来自其他模块的类型添加遵循)发出警告:
```swift
extension String: SomeThirdPartyProtocol {} // ⚠️ retroactive
```
如果这是有意为之,请使用 `@retroactive` 显式标记。
快速检查
在条件遵循扩展中,哪个关键字用于引入条件?
回顾
要点回顾:
• `extension T: Protocol where Param: Constraint` — 条件遵循
• 数组、可选类型、结果类型等会通过这种方式遵循可等价比较、可哈希、可编码协议
• 自定义泛型类型也可以这样做
• `where Element == Int` 将类型限制为特定的具体类型
• Swift 5.7+ 中,追溯性遵循需要使用 `@retroactive`
下一节:Self 要求。
常见问题解答
「条件一致性」课时是免费的吗?
是的 — 「条件一致性」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「条件一致性」这节课中我会学到什么?
使用 where 子句让泛型类型有条件地遵循协议。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「条件一致性」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。