> On Dec 5, 2016, at 10:50 AM, Charles Srstka <[email protected]> wrote:
>
>> On Dec 5, 2016, at 11:39 AM, Joe Groff <[email protected]
>> <mailto:[email protected]>> wrote:
>>
>>> On Dec 4, 2016, at 6:46 PM, Charles Srstka via swift-evolution
>>> <[email protected] <mailto:[email protected]>> wrote:
>>>
>>> The following currently does not work:
>>>
>>> protocol P: class {}
>>> class C: P {}
>>>
>>> func foo<T>(t: T) where T: AnyObject {
>>> print("foo")
>>> }
>>>
>>> let p: P = C()
>>>
>>> foo(t: p) // error: cannot invoke 'foo' with an argument list of type '(t:
>>> P)'
>>>
>>> It seems to me that this ought to have been allowed, since P is declared as
>>> being a reference type and thus should have been able to satisfy the
>>> function’s requirements.
>>>
>>> Is this worthy of writing a language proposal, or would this be considered
>>> a bug that should be sent through the radar system instead?
>>
>> It's a limitation of the current implementation. `AnyObject` is taken as
>> meaning that a conforming type has a representation that consists of a
>> single refcounted pointer. Protocol existentials do not have a
>> single-refcounted representation since the witness table for the
>> conformances must also be carried around, therefore the protocol type does
>> not conform to AnyObject's representation requirement.
>
> Is there any way to just say “This function takes any reference type” that
> will work?
You could take 'AnyObject' as the parameter type instead of as a generic
constraint. In the fullness of time, we ought to allow protocol types to be
implicitly opened, since the value inside `p` conforms to `AnyObject` even if
the type `P` happens not to.
-Joe
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution