[swift-users] Weird protocol behaviour.
Rien
Rien at Balancingrock.nl
Fri Dec 23 03:03:48 CST 2016
> On 23 Dec 2016, at 09:43, Mikhail Seriukov <zloisop at 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 <rien at starbase55.com>:
>
>> On 22 Dec 2016, at 22:43, Howard Lovatt <howard.lovatt at 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 <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
>>
>>
>
>
More information about the swift-users
mailing list