[swift-evolution] [Pitch] Refactor Metatypes

Anton Zhilin antonyzhilin at gmail.com
Thu Sep 29 04:22:09 CDT 2016

2016-09-29 3:31 GMT+03:00 Colin Barrett via swift-evolution <
swift-evolution at swift.org>:

>    -
>    Type<T> is the concrete type of T.self. A Type<T> only ever has one
>    instance, T.self; even if T has a subtype U, Type<U> is not a subtype
>    of Type<T>.
>    -
>    Subtype<T> is the supertype of all Types whose instances are subtypes
>    of T, including T itself:
>    -
>    If T is a struct or enum, then Type<T> is the only subtype of
>    Subtype<T>.
>    -
>    If T is a class, then Type<T> and the Types of all subclasses of T are
>    subtypes of Subtype<T>.
>    -
>    If T is a protocol, then the Types of all concrete types conforming to
>    T are subtypes of Subtype<T>. Type<T> is not itself a subtype of
>    Subtype<T>, or of any Subtype other than Subtype<Any>.
> I’m having trouble reconciling this with rule #2 above, which states that
> “Subtype is the supertype of all Types whose instances are subtypes of T,
> including T itself.” Which one is wrong, or am I confused?
#2 applies to types, and #5 applies to protocols. If T is a type, then
Type<T> is always a subtype of Subtype<T>. If T is a protocol, then Type<T>
is never a subtype of Subtype<T>.

One thing I haven’t understood the motivation for exactly is what someone
> would be able to do with a Proto.self. Dynamic conformance checking? For a
> concrete T, having its .self seems useful for doing dynamic casts and such,
> but I don’t understand why for a Proto you need to have both. You did a
> good job of explaining why T.Protocol and T.Type are different, but not why
> both of them need to exist. So you could definitely do more to spell out
> the use-cases here.
I honestly can’t imagine a use case for .Protocol currently. Maybe
enumerating protocols that exist in the program, just for the sake of it.

>    -
>    Metatypes of functions are a little bit more special (the subtyping
>    relation on functions flips around for parameter types
>    <https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)>
>    ):
>    -
>       - Type<(Any) -> Void> is a subtype of Subtype<(Int) -> Void> etc.
>       - Type<(Void) -> Int> is a subtype of Subtype<(Void) -> Any>
> Does this potentially expose contravariant type parameters, and is that an
> issue? (I’m trying to imagine a scenario where you could have an A on the
> left hand side of an arrow and have that leak out to other clients, but I
> haven’t had a chance to write much Swift 3 yet, unfortunately.)
Could you give a code example, where that would be an issue?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160929/62d6d9ca/attachment.html>

More information about the swift-evolution mailing list