[swift-evolution] [Discussion] Seal `T.Type` into `Type<T>`
Anton Zhilin
antonyzhilin at gmail.com
Wed Jul 13 13:31:21 CDT 2016
2016-07-13 20:19 GMT+03:00 Adrian Zubarev via swift-evolution <
swift-evolution at swift.org>:
>
> Am 13. Juli 2016 um 18:30:53, Anton Zhilin (antonyzhilin at gmail.com)
> schrieb:
>
> I see model of Type<T> as follows:
>
> 1. Values of Type<T> are identifiers of types (8 bytes, I guess)
> 2. All used identifiers are contained in Type<Any>
> 3. Type<T> contains a subset of those identifiers
>
> I can’t follow your though here. Is this a totally new behavior?
>
That's how it works right now:
sizeofValue(Bool.self) //=> 0 (optimized away)
sizeofValue(Bool.self as Any.self) //=> 8
I'll put my thoughts another way:
- Internally, Type<T> contains an Int, i.e. identifer of a type. For
every type, compiler must choose a different identifier
- API of Type<T> is defined so that it can only contain identifiers of
subtypes of T
- For example, when you get a variable of Type<BaseClass>, it can
correspond to BaseClass or DerivedClass
> 1. 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.
>
We should add implicit convertion of Type<U> to Type<T>, dulicating current
behaviour of `as T.Type`.
That constructor still can be useful, but it will be failable and not that
significant in practise.
I don't like adding compiler magic, but I guess we really should in this
case, because otherwise Type<T> can't replace T.Type.
>
> 1. Size of Type<Type<T>> is 8, static size of Type<SomeProtocol> is 0
>
> I feel like you mean something different here than this:
>
> ```swift
>
> protocol SomeProtocol {}
>
>
> sizeof(SomeProtocol.self) == 40
>
> ```
>
That was a mistake. Static size of Type<SomeProtocol> will be 40, and size
property of its values can be less or greater than 40, depending on
internal type identifier.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160713/caaf4389/attachment.html>
More information about the swift-evolution
mailing list