Compile Time vs. Run Time Type Checking in Swift
The dynamic type check in the above example actually works correctly. The body of the
if letblock is only executed for types that conform to our two expected protocols. However, we cannot convey this to the compiler. The compiler expects a concrete type (one that has a fully specified type at compile time) that conforms toHumanTypeandHasName. All we can offer is a dynamically verified type.[…]
The solution of the “type erased” function that accept an
Anyargument isn’t really nice either; but in practice I have used similar approaches in cases where other code guarantees that the function will be called with the correct type, but there wasn’t a way of expressing that within Swift’s type system.
Update (2016-05-12): Joe Groff:
It is possible to “open” a protocol<> type into a concrete type via a protocol extension.