首页 > 解决方案 > 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>

但是,究竟如何?

标签: swiftprotocols

解决方案


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. 另一方面,您不能调用fooon ,因为inP.Protocol没有实现。fooP

另见:https ://swiftrocks.com/whats-type-and-self-swift-metatypes


推荐阅读