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 <sw...@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@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@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@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@swift.org > > https://lists.swift.org/mailman/listinfo/swift-users > > > _______________________________________________ > swift-users mailing list > swift-users@swift.org > https://lists.swift.org/mailman/listinfo/swift-users > > _______________________________________________ > swift-users mailing list > swift-users@swift.org > https://lists.swift.org/mailman/listinfo/swift-users > > >
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users