In your example, when Array
conforms to P
, the Array
version of whatAmI()
is the most specialized already, so you get the right answer. Add this to your example and it will better parallel @jrose's:
extension Array where Element: P {
func whatAmI() { print("Array<P>") }
}
extension Int: P {
func whatAmI() { print("Int") }
}
The output will be:
Array<P>
Array
That's the one that bothers me most. A protocol requirement is meant to be a point of dynamic dispatch, where you jump to a version of the code that's been customized for the concrete type... but we don't actually get all of the customization we want (or expect).
I'm less bothered by @jrose's example because I don't feel like a call to a function that is neither an overridable method in a class or a protocol requirement should allow different behavior with different types at runtime.
I appreciate that we're gathering a corpus of examples and opinions. One needs those to evaluate designs.
Doug