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

Reply via email to