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
的类型是P?
,那就意味着T === P
在foo()
,对吗?
- 也就是说
foo()
的t
参数的类型是P.Type
.
P.self
的类型是P.Protocol
。
- 所以我们将
P.Protocol
传递给 foo()
,在那里它被转换为 P.Type
。
- 但是为什么这样的转换没有失败呢?据记载,协议
不符合自身。
- 确实,
let pt: P.Type = P.self
确实失败了。
- 直接
P.Protocol -> P.Type
转换失败有什么区别,
以及调用 foo(P.self)
? 时发生的隐式转换
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
以下似乎有效:
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
的类型是P?
,那就意味着T === P
在foo()
,对吗? - 也就是说
foo()
的t
参数的类型是P.Type
. P.self
的类型是P.Protocol
。- 所以我们将
P.Protocol
传递给foo()
,在那里它被转换为P.Type
。 - 但是为什么这样的转换没有失败呢?据记载,协议 不符合自身。
- 确实,
let pt: P.Type = P.self
确实失败了。 - 直接
P.Protocol -> P.Type
转换失败有什么区别, 以及调用foo(P.self)
? 时发生的隐式转换
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