[swift-evolution] [Completing Generics] Any<> syntax, base class constraints, and existential metatypes
Matthew Judge
matthew.judge at gmail.com
Sat Mar 5 09:03:50 CST 2016
I may be a bit off in my thinking here, but extension P vs. extension Any<P> seems like it might offer a pretty straightforward implementation (at least syntactically and conceptually) for static vs. dynamic dispatch.
> On Mar 4, 2016, at 14:16, Joe Groff via swift-evolution <swift-evolution at swift.org> wrote:
>
>
>> On Mar 2, 2016, at 5:50 PM, Joe Groff via swift-evolution <swift-evolution at swift.org> wrote:
>>
>> Something else to consider: Maybe we should require Any<...> to refer to all existential types, including single-protocol existentials (so you'd have to say var x: Any<Drawable> instead of var x: Drawable). Between static method requirements, init requirements, and contravariant self and associated type constraints, there are a lot of ways our protocols can diverge in their capabilities as constraints and dynamic types. And with resilience, *no* public protocol type can be assumed to resilient implicitly conform to its protocol, since new versions may introduce new requirements that break the self-conformance. If protocols are namespaced separately from types, you could still do something like:
>>
>> typealias Drawable: Drawable = Any<Drawable>
>>
>> if you intend to use the protocol type primarily as a dynamic type (and assert that it's self-conforming).
>
> Any<> syntax also allows for a few useful extensions and syntax refinements:
>
> - We could gain back the often-missed ability from ObjC to express a type that both inherits a base class and implements a protocol, spelling that Any<BaseClass, Protocol>. That's less weird than using protocol<...> to refer to class constraints.
> - We can make our syntax for existential metatypes (some dynamic type that conforms to P, "exists T: P. (T.Type)") and metatypes-of-existentials (the exact type of the existential, "(exists T: P. T).Type". Currently we spell the former as `P.Type` and the latter as `P.Protocol`, and people writing generics occasionally get caught out when substituting `T = P` into `T.Type` gives them `P.Protocol`. It would make sense to me to put `.Type` inside the Any<> brackets for existential metatypes, Any<P.Type> (today's P.Type), and have Any<P>.Type refer to the exact type `Any<P>` (today's P.Protocol).
>
> -Joe
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160305/b15f1bf8/attachment.html>
More information about the swift-evolution
mailing list