[swift-users] Weird protocol behaviour.

Howard Lovatt howard.lovatt at gmail.com
Thu Dec 22 15:43:41 CST 2016


The following variation works:

protocol P {}


class P1:P {}


class X:P1 {}


func foo<A:P>(_ x:A) {}


func bar() {

    //let x = X() // this compiles

    let x = X() as P1 // this does not compile. Why?

    foo(x)

}

Which adds credence to the bug theory.

Note two changes: 1. two levels of inheritance and 2. change to classes. If
you do two levels using protocols it doesn't work if you use either classes
or structs.


  -- Howard.

On 23 December 2016 at 07:29, Kevin Nattinger <swift at nattinger.net> wrote:

> I recall seeing a request on the -evolution list for something like `T :=
> X` to indicate it could be X itself or anything inheriting / implementing
> it, so it’s certainly known behavior, if not desired. IMO it’s a bug and
> `:` should be fixed to include the root type, whether or not that requires
> a discussion on -evolution.
>
> On Dec 22, 2016, at 2:17 PM, Howard Lovatt via swift-users <
> swift-users at swift.org> wrote:
>
> I suspect a compiler bug since A is a P. The equivalent in Java works:
>
> interface P {}
> class X implements P {}
>
>
> <A extends P> void foo(A x) {}
>
>
> void bar() {
>     final P x = new X();
>     foo(x);
> }
>
> -- Howard.
>
> On 23 Dec 2016, at 3:19 am, Rien via swift-users <swift-users at swift.org>
> wrote:
>
> IMO the error message says it all:
>
> Playground execution failed: error: MyPlayground8.playground:9:5: error:
> cannot invoke 'foo' with an argument list of type '(P)'
>    foo(x)
>    ^
>
> MyPlayground8.playground:9:5: note: expected an argument list of type '(A)'
>    foo(x)
>    ^
>
> I.e. you are passing in a protocol while the function is specified for a
> type.
> Said other way: On which data do you expect the protocol to operate?
>
> Regards,
> Rien
>
> Site: http://balancingrock.nl
> Blog: http://swiftrien.blogspot.com
> Github: http://github.com/Swiftrien
> Project: http://swiftfire.nl
>
>
>
>
> On 22 Dec 2016, at 17:05, Mikhail Seriukov via swift-users <
> swift-users at swift.org> wrote:
>
>
> Hello community! I' wondering if somebody can explain this to me.
>
> Please take look at the snippet.
>
>
> protocol P {}
>
> struct X:P {}
>
>
> func foo<A:P>(_ x:A) {}
>
>
> func bar() {
>
>    //let x = X() // this compiles
>
>    let x = X() as P // this does not compile. Why?
>
>    foo(x)
>
> }
>
>
> I expect the both cases to work though. But only first works? And I do not
> understand why.
>
> My coworkers said that it is a compiler bug, but I'm not shure it is.
>
> Thanks for the help.
>
> _______________________________________________
>
> swift-users mailing list
>
> swift-users at swift.org
>
> https://lists.swift.org/mailman/listinfo/swift-users
>
>
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users
>
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20161223/adfcfeb4/attachment.html>


More information about the swift-users mailing list