[swift-evolution] Passing class protocols to functions accepting AnyObject
Joe Groff
jgroff at apple.com
Mon Dec 5 11:39:14 CST 2016
> 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.
-Joe
More information about the swift-evolution
mailing list