> On May 30, 2016, at 5:22 AM, Charles Srstka via swift-evolution 
> <[email protected]> wrote:
> 
>> On May 29, 2016, at 10:13 PM, Matthew Johnson <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>> On May 29, 2016, at 9:43 PM, Charles Srstka <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>>>> On May 29, 2016, at 9:20 PM, Matthew Johnson <[email protected] 
>>>> <mailto:[email protected]>> wrote:
>>>> 
>>>> On May 29, 2016, at 5:43 PM, Charles Srstka via swift-evolution 
>>>> <[email protected] <mailto:[email protected]>> wrote:
>>>> 
>>>>>> On May 29, 2016, at 5:16 PM, Austin Zheng <[email protected] 
>>>>>> <mailto:[email protected]>> wrote:
>>>>>> 
>>>>>> I think the problem here is that P == P is true, but P : P is not (a 
>>>>>> protocol does not conform to itself).

not that simple. see further down.

>>>>> 
>>>>> But if you have a variable, parameter, etc. typed as P, that’s *not* the 
>>>>> protocol, since protocols aren’t concrete entities. What you have there, 
>>>>> by definition, is something that conforms to P. Similarly, something like 
>>>>> [P] is just a collection of things, perhaps of various types, which all 
>>>>> have the common feature that they conform to P.
>>>> 
>>>> You have an existential value of type P.  It is a well known frustration 
>>>> in Swift that the existential type corresponding to a protocol does not 
>>>> conform to the protocol.  This has been discussed off and on at different 
>>>> times.  
>>>> 
>>>> There are a couple of reasons this is the case.  IIRC in some cases it 
>>>> actually isn't possible for the existential to conform to the protocol in 
>>>> a sound way.  And even when it is possible, I believe it has been said 
>>>> that it is more difficult to implement than you might think.  Hopefully 
>>>> the situation will improve in the future but I'm not aware of any specific 
>>>> plans at the moment.
>>> 
>>> It’s been my understanding that a variable typed P in swift is equivalent 
>>> to what we would have called id <P> in Objective-C—that is, an object of 
>>> unknown type that conforms to P. Is this not the case? I am curious what 
>>> the conceptual difference would be, as well as the rationale behind it.
>> 
>> Existentials have their own type in Swift.  The problem you are running into 
>> is because the generic constraint is looking at the existential type of P 
>> and asking if that type conforms to P (which it does not - you can't write 
>> the conformance and the compiler does not provide it for you).  It is not 
>> asking if the type of the object underlying the existential value conforms 
>> to P (which it necessarily does).  When you have a value of type P you have 
>> already erased the type of the underlying object.
> 
> Have we not also erased the type of the underlying object with id <P>, 
> though? The only thing we get from the “id” is that it’s an Objective-C 
> object of some type, which it would have to have been anyway in order to 
> conform to the protocol in the first place. Thus the type of the object is 
> erased, and the only thing we know about it is that it conforms to the 
> protocol—just like something typed P in Swift.
> 
> What I’m trying to figure out is whether there’s any positive benefit or 
> rationale to the reason things work the way they do here, or whether it’s 
> just bugs / implementation details.
> 

I’ve been wondering about that one because of this:

    /// Whether the existential of this protocol conforms to itself.
    unsigned ExistentialConformsToSelf : 1;

but in the end it is false for non obj-c protocols (which eliminates the Struct 
in the example). but there are still more rules


> Charles
> 
> _______________________________________________
> swift-evolution mailing list
> [email protected] <mailto:[email protected]>
> https://lists.swift.org/mailman/listinfo/swift-evolution 
> <https://lists.swift.org/mailman/listinfo/swift-evolution>
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to