print(P.Protocol.self) // this one is new to me that it compiles.
Here is what I mean, I asked Joe long long time ago if there is any good workaround to this problem but I doubt the situation changed since then:
protocol P {}
func whatAmI<T>(_ t: T.Type) {
print(type(of: t))
}
whatAmI(P.self) // P.Protocol
whatAmI(P.Type.self) // P.Type.Protocol
whatAmI(P.Protocol.self) // P.Protocol.Type
whatAmI(Any.Type.self) // Any.Type.Protocol
whatAmI(AnyObject.Type.self) // AnyObject.Type.Protocol