[swift-evolution] [swift-evolution-announce] [Review] SE-0089: Replace protocol<P1, P2> syntax with Any<P1, P2>

Jordan Rose jordan_rose at apple.com
Wed Jun 8 16:01:43 CDT 2016

> On Jun 8, 2016, at 13:16, Dave Abrahams via swift-evolution <swift-evolution at swift.org> wrote:
> on Wed Jun 08 2016, Thorsten Seitz <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>> Ah, thanks, I forgot!  I still consider this a bug, though (will have
>> to read up again what the reasons are for that behavior).
> Yes, but in the case of the issue we're discussing, the choices are:
> 1. Omit from the existential's API any protocol requirements that depend
>   on Self or associated types, in which case it *can't* conform to
>   itself because it doesn't fulfill the requirements.
> 2. Erase type relationships and trap at runtime when they don't line up.
> Matthew has been arguing against #2, but you can't “fix the bug” without
> it.

#1 has been my preference for a while as well, at least as a starting point. It's possible we could also "open" the existential when it's only used by one parameter, i.e. the first would be legal and the second wouldn't:

func foo<X: Hashable>(x: X) { … }
func test(x: Any<Hashable>) {
  foo(x) // okay, passes the dynamic type

func bar<X: Hashable>(a: X, b: X) { … }
func test(x: Any<Hashable>, y: Any<Hashable>) {
  bar(x, y) // illegal because x.dynamicType may be different from y.dynamicType

(The check is not as simple as "the generic parameter is only mentioned once", because of constraints and such. But you get the idea.)


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

More information about the swift-evolution mailing list