[swift-evolution] [Discussion] Seal `T.Type` into `Type<T>`

Adrian Zubarev adrian.zubarev at devandartist.com
Wed Jul 13 12:19:54 CDT 2016

Am 13. Juli 2016 um 18:30:53, Anton Zhilin (antonyzhilin at gmail.com) schrieb:

I see model of Type<T> as follows:
Values of Type<T> are identifiers of types (8 bytes, I guess)
All used identifiers are contained in Type<Any>
Type<T> contains a subset of those identifiers
I can’t follow your though here. Is this a totally new behavior?

Type<T> are usually created with default constructor Type<T>()
That one is easy and already there.

Upcasting uses constructor init<U: T>(upcasting: Type<U>)
It does look neat but I can’t implement it. At least I have no clue how to solve the problem that `T` is not a protocol or a class type.

Checking for conformance uses method isSubtype(of:)
Interesting suggestion.

Size of Type<Type<T>> is 8, static size of Type<SomeProtocol> is 0
I feel like you mean something different here than this:


protocol SomeProtocol {}

sizeof(SomeProtocol.self) == 40

2016-07-13 18:25 GMT+03:00 Adrian Zubarev via swift-evolution <swift-evolution at swift.org>:
a = SomeClass.self

expectTrue(a as? Any.Type == SomeClass.self)
expectTrue(a as? AnyClass == SomeClass.self)
expectTrue(a as? SomeClass.Type == SomeClass.self)
That example just demonstrates syntax of metatypes and does not count.
What about dynamicType?

It should have the following signature:

func dynamicType<T>(_ var: T) -> Type<T>

To return Type<T> means to return an identifier of U: T
Was this a typo?

func dynamicType<U: T>(_ var: T) -> Type<U>

PS: If you’d like to join on this idea, I could move the draft to a repo to be able to write the proposal together. You had some good catchy ideas there.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160713/42441435/attachment.html>

More information about the swift-evolution mailing list