Sorry, should have taken the comments out of the example, they obviously have no meaning anymore.
Regards, Rien Site: http://balancingrock.nl Blog: http://swiftrien.blogspot.com Github: http://github.com/Swiftrien Project: http://swiftfire.nl > On 23 Dec 2016, at 10:03, Rien <r...@balancingrock.nl> wrote: > > >> On 23 Dec 2016, at 09:43, Mikhail Seriukov <zloi...@gmail.com> wrote: >> >> No it does not. >> You have made a type out of the parameter. It’s no longer a protocol. >> IMO the failure here is to understand the difference between a type and a >> protocol. >> A type (even if empty) is always a combination of storage with functions >> (that are assumed to work on the data in storage) >> A protocol is just a definition of functions without the accompanying data. >> >> I see your point. >> But actually when I write it as `let x = X() as P` I really mean that I >> want `x` to be `AnyObject` but conforming to P, not just protocol itself. >> Is it even possible to downcast it this way? > > Yes, but only for a destination that needs a protocol. Not for a destination > that needs a type. > > I.e. in the example > > protocol P {} > struct X:P {} > > func foo<A: P>(_ x:A) {} > > func bar(_ x:P) {} > > func bar() { > var p: P > //let x = X() // this compiles > let x = X() as P // this does not compile. Why? > p = x > bar(p) > } > > Regards, > Rien. > >> >> 2016-12-23 14:51 GMT+07:00 Marinus van der Lugt <r...@starbase55.com>: >> >>> On 22 Dec 2016, at 22:43, Howard Lovatt <howard.lov...@gmail.com> wrote: >>> >>> 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. >> >> >> No it does not. >> You have made a type out of the parameter. It’s no longer a protocol. >> IMO the failure here is to understand the difference between a type and a >> protocol. >> A type (even if empty) is always a combination of storage with functions >> (that are assumed to work on the data in storage) >> A protocol is just a definition of functions without the accompanying data. >> >> Rien. >> >> >> >>> >>> 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