[swift-evolution] Passing class protocols to functions accepting AnyObject

Charles Srstka cocoadev at charlessoft.com
Mon Dec 5 12:50:25 CST 2016


> On Dec 5, 2016, at 11:39 AM, Joe Groff <jgroff at apple.com> wrote:
> 
>> On Dec 4, 2016, at 6:46 PM, Charles Srstka via swift-evolution <swift-evolution at swift.org> 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?

Charles

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20161205/25a395df/attachment.html>


More information about the swift-evolution mailing list