0Pricing
Swift Academy · 课时

何时使用存在类型(any P)与泛型

在 any P (存在类型)和 generics 之间做出选择:前者适合异构存储和动态行为,后者适合编译时特化和静态保证。

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

存在类型与泛型

存在类型(any P)会存储符合某个协议的未知具体类型的值。泛型(<T: P>)会在编译时保留具体类型,以便进行特化。

协议设置

不带关联类型的协议既可以轻松用作 any P 存在类型,也可以用作泛型约束。

protocol Animal {
    func speak() -> String
}
struct Dog: Animal { func speak() -> String { "woof" } }
struct Cat: Animal { func speak() -> String { "meow" } }

异构数组

使用 [any Animal] 将不同的协议遵循类型存储在一起,并且只能调用协议接口。

let zoo: [any Animal] = [Dog(), Cat()]   // heterogeneous array
for a in zoo { print(a.speak()) }              // "woof", "meow"

通过泛型实现特化

泛型会保留具体类型(T),从而实现更多优化并进行更严格的编译时检查。

// Generic version — compiler specializes for each concrete type
func shout<T: Animal>(_ a: T) {
    // Can inline/specialize based on concrete T
    print(a.speak().uppercased())
}
shout(Dog()) // WOOF
shout(Cat()) // MEOW

PAT 的局限性

如果需要使用关联类型,带有关联类型的协议不适合作为普通存在类型。请优先使用泛型或类型擦除(例如 AnySequence)。

protocol Container {
    associatedtype Item
    func get(_ i: Int) -> Item
}
// Storing as `any Container` loses the concrete Item.
// You can't use Item directly without additional constraints or type erasure.

何时选择哪一种

请选择:

  • 当您需要存储异构值,或只通过协议接口实现动态行为时,使用 any P。
  • 当您需要静态类型、更好的优化,或必须关联多个类型(例如使用相同的 Item)时,使用泛型。
  • 对于 Item 很重要的 PAT,请使用泛型或添加类型擦除。

any P 与泛型

快速检查:什么时候应优先使用 any P?

回顾

回顾:使用 any P 存储混合的协议遵循类型并实现动态行为;使用泛型进行编译时特化,以及在关联类型或类型关系很重要时使用泛型。

常见问题解答

「何时使用存在类型(any P)与泛型」课时是免费的吗?

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

「何时使用存在类型(any P)与泛型」这节课中我会学到什么?

在 any P (存在类型)和 generics 之间做出选择:前者适合异构存储和动态行为,后者适合编译时特化和静态保证。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

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

「何时使用存在类型(any P)与泛型」课时需要多长时间?

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

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

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

此课程中的所有课时

  1. associatedtype 与泛型协议
  2. 类型擦除模式(AnySequence/AnyIterator)
  3. 何时使用存在类型(any P)与泛型
← 返回 Swift Academy