Swift P.Protocol 对比 P.Type

Swift P.Protocol vs P.Type

以下似乎有效:

protocol P {}
class C: P {}
let c = C()
func foo<T>(_ t: T.Type) -> T? { return c as? T }
let p = foo(P.self)
print(type(of: p))   //  Optional<P>

但究竟如何呢?

P.Protocol 协议P的元类型,就像T.Type 非协议类型的元类型 T。没有正在进行的“转换”。

那么P.Type是什么?

P.Type 是一个存在元类型。非协议类型没有对应的东西。假设你想存储符合 P 的具体类型的元类型,你可以将它存储在 P.Type:

let x: P.Type = C.self

注意P.Type只能存储具体类型的元类型,P.Protocol只能存储协议的元类型。要了解为什么这种划分很重要,假设 P 定义了静态方法 foo,然后您可以调用 x.foo()。这保证有效,因为 P.Type 必须有一个具体类型,它将实现 foo。另一方面,您不能在 P.Protocol 上调用 foo,因为 P 中没有 foo 的实现。

另请参阅:https://swiftrocks.com/whats-type-and-self-swift-metatypes